10
votes

Problème de performance utilisant des flux d'objets Java avec des sockets

J'essaie de faire une IPC locale à l'aide de sockets et de flux d'objets dans Java, mais je vois des performances médiocres.

Je teste la durée de ping d'envoyer un objet via une objectoutputputtream pour recevoir une réponse via un objetInputStream sur Une prise.

Voici le demandeur: xxx

voici le répondeur: xxx

le résultat Je reçois, c'est:

par ping: 80.35

80 ms est loin de ralentir au trafic local.

Demande et Les classes de réponse sont très petites et leur sérialisation est rapide.

J'ai essayé naïf ajout: xxx

avec peu d'effet.

Effectuer une locale de pinghost: xxx

est également rapide.

Java version 1.6.0_05L Courir sur RedHat 2.4


0 commentaires

5 Réponses :



-1
votes

Je m'attendrais à ce que vous deviez appeler objetOutputtream.flush () des deux côtés pour vous assurer que les données sont immédiatement envoyées au réseau. Sinon, la pile TCP peut attendre un moment pour plus de données pour remplir un paquet IP partiel.


1 commentaires

Oui, j'ai ajouté cela dans et non fait une note. Cela ne fonctionne tout simplement pas sans la couleur.



0
votes

En plus de l'utilisation de flux tamponnés et d'appeler Flush () Avant chaque lecture, vous devez également créer d'abord l'objetOutputStream d'abord aux deux extrémités. De plus, les tests pour ReadObject () renvoyant NULL sont inutiles à moins que vous prévoyez d'appeler WrdiolObject (NULL). Le test d'EOS avec ReadObject () est CATCH (EOFException SC).


2 commentaires

Je suis tombé à travers cela tout en recherchant ma réponse à une autre question ( Stackoverflow.com/Questtions/26320156/... ). Le truc décollant est que l'objetOutputStream fait un certain tampon lui-même. Donc, peut-être que c'est le flush (seul) qui aide ... en déclenchant la pile réseau pour appuyer maintenant les données.


@Stephenc non, c'est la Création , dans le bon ordre, cela aide. Il n'y a pas de mise en mémoire tampon dans le processus de création d'en-tête, sauf s'il y a un flux de sortie tampon inférieur dans la pile.



1
votes

Construisez ainsi la bufferedOutPutStream et la chasser avant de construire la bufferedInputStream. Pour éviter de suspendre.

http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 4788782

Il dit selon la documentation

Si vous modifiez le cas de test de telle sorte que la construction aserver et acliente l'objetOutputStream avant le ObjectInPhatStream, le test ne bloquer. C'est l'attendu comportement donné le suivant Documentation:

ObjectOutPutStream constructeur:
Crée une objection d'objet qui écrit sur le


Provitystream. Ce constructeur écrit l'en-tête de la série de sérialisation à le flux sous-jacent; Les appelants peuvent souhait de rincer le flux immédiatement pour s'assurer que Constructeurs pour recevoir
ObjectInPhatStreams ne bloquera pas quand lire l'en-tête.

constructeur ObjectInPhatStream:
Crée un objetInputStream qui lit du
spécifié Flux d'entrée. Un flux de sérialisation L'en-tête est lu du flux et vérifié. Ce constructeur bloquera jusqu'à ce que le


ObjectOutputStream a écrit et rinçage de l'en-tête.


1 commentaires

Vous voulez dire 'alors construisez l'objet objet sortiestream et le rincer'.



0
votes

J'aurais toujours pensé que ce serait plus rapide que ça. Y a-t-il autre chose que je puisse faire pour améliorer cela?

Cela semble être quelque chose d'un micro-repère. Ils sont toujours difficiles à bien avoir raison, mais je pense que si vous commencez par envoyer en 2000 messages avant de commencer vos mesures de latence.

Aussi, voir Ceci < / a> Réponse détaillée sur la manière de faire des micro-repères correctes.


0 commentaires