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. P>
Voici le demandeur: p> voici le répondeur: p> le résultat Je reçois, c'est: p> 80 ms est loin de ralentir au trafic local. P> Demande et Les classes de réponse sont très petites et leur sérialisation est rapide. P> J'ai essayé naïf ajout: p> avec peu d'effet. P> Effectuer une locale de pinghost: p> est également rapide. p> Java version 1.6.0_05L
Courir sur RedHat 2.4 P> P>
5 Réponses :
Avez-vous essayé d'intégrer les deux requêtes TS et les réponses dans BufferedInputStream / BufferedOutPutStream A>? Il devrait améliorer largement les performances. P>
J'ai changé cela aux deux extrémités pour être: ObjectOutputStream ObjectOutStream = Nouvelle ObjectOutPutStream (nouveau bufferedOutPutStream (socket.getoutPutStream ())); ObjectInPhatStream ObjectInPhatStream = Nouveau Objecteur (Nouveau BufferedInputStream (Socket.getInputStream ())); Et c'est beaucoup amélioré! Par Ping: 0,1354 J'aurais toujours pensé que ce serait plus rapide que cela. Y a-t-il autre chose que je puisse faire pour améliorer cela?
Je m'attendrais à ce que vous deviez appeler objetOutputtream.flush () code> 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. P>
Oui, j'ai ajouté cela dans et non fait une note. Cela ne fonctionne tout simplement pas sans la couleur.
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). P>
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 i>, 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.
Construisez ainsi la bufferedOutPutStream et la chasser avant de construire la bufferedInputStream. Pour éviter de suspendre. P>
http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 4788782 p>
Il dit selon la documentation p>
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: P>
ObjectOutPutStream constructeur: strong>
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. P>
constructeur ObjectInPhatStream: strong>
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. P> blockQuote>
Vous voulez dire 'alors construisez l'objet objet i> sortiestream et le rincer'.
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? P> blockQuote>
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. P>
Aussi, voir Ceci < / a> Réponse détaillée sur la manière de faire des micro-repères correctes. P>