Frage an Java-IO-Performance-tuning -
Ich versuche zu optimieren, eine web-basierte Anwendung, die eine Menge von dem schreiben in den stream.
Der code ist so etwas wie das ---
StringWriter stringWriter = new StringWriter(1024);
PrintWriter printWriter = new PrintWriter(stringWriter);
Dann ist dies printwriter wird verwendet, um eine Menge von lese-Operationen an verschiedenen Orten, wie --
printWriter.write("set interface ethernet0 zone Trust");
Ich soll zur Optimierung der mehrere schreib-Operationen durch die Verpackung des printwriter um einen bufferedwriter. Also Plane ich zu ändern gerade1 und gerade2 wie unten.Bitte lassen Sie mich wissen, wenn der Ansatz unten ist richtig --
StringWriter stringWriter = new StringWriter(1024);
//go for bufferedwriter instead of printwriter.
BufferedWriter bufWriter = new BufferedWriter(stringWriter, 8*1024);
Außerdem denke ich, dass nun ich ersetzen können, die write-Methode direkt als in -
printWriter.write("set interface ethernet0 zone Trust");
ersetzt
bufWriter.write("set interface ethernet0 zone Trust");
Bitte lassen Sie mich wissen, ob dies korrekt ist oder muss ich die alle verwenden die überladenen Methoden von BufferedWriter, um vollen nutzen aus den BufferedWriter.
Dank,
Dev
- darf ich wissen, was Sie tryin zu erreichen, aus dem obigen code, pls lassen Sie uns wissen, was Sie tun möchten, in buisness Sinn.
- Ich schlage vor, Sie performance-Profil der Anwendung. Wenn Sie zu langsam ist, das ist sehr unwahrscheinlich das die Ursache sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen der BufferedWriter nur fügt eine zusätzliche Kopie der Betrieb für jeden char geschrieben. Ändern Sie die anfängliche Größe des StringWriter stattdessen eine größere Anfangsgröße bedeutet weniger wächst und weniger kopieren später.
Den StringWriter selbst enthält eine wachsende Puffer für Zeichen-Daten, hinzufügen eines zusätzlichen Puffers auf der Oberseite der es mit einem BufferedWriter wird nicht dazu führen, beschleunigen. Aus den angegebenen code eine größere Anfangsgröße für die StringWriter-Objekt selbst, helfen könnte.
Seit
StringWriter
schreibt in einen string-Puffer (im Speicher) per definition, wickelte Sie in einBufferedWriter
sollte nicht haben keine Auswirkungen auf die Leistung. (Durch die zusätzliche Dereferenzierungsebene, es kann in der Tat machen Sie Ihre code ein wenig langsamer, obwohl diesdievielleichtwahrscheinlichwegoptimiert durch den JIT-compiler.)Letzteres ist nützlich bei der Datei-I/O, wo man groß schreiben, die tendenziell viel schneller als mehrere kleine.
Warum Sie denken, Sie müssen, tune, dieses Stück code? Es kann sein, lohnt sich durch die folgenden
Allgemeine Richtlinien zum performance-tuning
Tun, die Sie wirklich brauchen, um mit StringWriter? StringWriter ist nur ein proxy für StringBuffer, die synchronisiert auf sich selbst mit jedem mal Anhängen genannt wird.
Haben Sie sich überlegt mit StringBuilder statt. Es ist nicht synchronisiert (und daher nicht thread-sicher), aber sollte schneller sein-vor allem, wenn Sie tun, viele kurze schreibt.
edit: Die synchronisation Problem ist doppelt wichtig, denn PrintWriter wird auch synchronisiert. Jedes mal, wenn Sie rufen print/schreiben Sie Ihren code zu erwerben und release zwei Schlösser. Ich vermute, dies könnte sein, warum Sie code, die Ausgaben erhebliche Mengen an Zeit in der write-Methode.
Bearbeiten:
Wenn Sie wirklich müssen verwenden PrintWriter dann die folgenden alternativen funktionieren könnte, auf die Einschränkung, dass der PrintWriter ist nur ein thread Zugriff hat -- andernfalls könnte es einen deadlock verursachen. Um diese Arbeit zu machen sowie alle Schreibvorgänge durchgeführt werden müssen, in der GLEICHEN synchronisierten block, sonst werden Sie einfach auf das gleiche problem -- z.B. ein-und aussteigen viel synchronisiert bit-code.
Wenn Sie nicht müssen, verwenden ein PrintWriter dann einen StringWriter allein sollte genügen.
Was gemeint war meine erste Anregung:
Dass Sie aufrufen müssen, Anhängen, anstatt zu schreiben, ist, warum würden Sie brauchen, um umgestalten von code.
Ich bezweifle wirklich, dass
BufferedWriter
geben jedem die Leistung gesteigert werden - und dasStringWriter
schreiben direkt in den Speicher. Wenn überhaupt wird es langsam Dinge, die (geringfügig) nach unten durch hinzufügen einer Schicht der Dereferenzierung. Natürlich, wenn Sie finden, anders, bitte korrigieren Sie mich. Was macht Sie denken, dies ist ein Engpass?