Ich habe kürzlich festgestellt, dass ein bestimmter Teil meines Codes wesentlich langsamer läuft, seit ich auf Java 7 aktualisiert habe. Ziemlich überraschend, da Java 7 global schneller ist als Java 6.
Das Programm ist ziemlich groß, aber es ist mir gelungen, einen reproduzierbaren Code zu extrahieren, um zu zeigen, wie Java 7 langsamer als Java 6 ist.
Wenn Sie den gleichen Code mit Java 6 und Java 7 ausführen, sehen Sie Java 7 ist etwa 7-8 mal langsamer als Java 6 !!!
Hier ist der Code (nicht versuchen, zu verstehen, was es tut, es ist nur eine abstrakte von der realen Code und als solche macht keinen Sinn). Es ist im Grunde ein Code, der eine Zeichenkette analysiert, um einen Teil davon zu formatieren:
%Vor%Auf meinem Computer, wenn ich ihn mit Java 6 starte, erhalte ich eine durchschnittliche Zeit von 60ms um ihn auszuführen.
Wenn ich es mit Java 7 starte, dauert es 460ms .
Bin ich der Einzige, der das bemerkt hat? Danke,
Edit: Hier ist das neue Programm, das die defekte Methode ist DefaultStyledDocument.setCharacaterAttributes () in Java 7 :
%Vor%Auf meinem Computer:
Java 6: ~ 1 Sek.
Java 7: ~ 4.5 sec
Wie kann ich Java 7 so schnell wie in Java 6 einsetzen? Danke,
BEARBEITEN: Hier ist eine Problemumgehung, die die Perf korrigiert. Problem mit Java 7 (Ich habe es auf insertString () und remove () ):
%Vor%Ich denke, das Problem ist nicht das Dokument, sondern Unterschiede in der Struktur der Ansicht.
Versuchen Sie, ein Dokument ohne JTextPane zu erstellen und alle Stile anzuwenden.
In java7 wurden Break-Spots-Berechnungen eingeführt, um zu definieren, wo die Ansicht umgebrochen werden kann. Es gibt einen Fehler im Layout, siehe Strange text wrapping mit formatiertem Text in JTextPane mit Java 7
Das Gleiche passiert mit einem einfachen Layout.
Sie können versuchen, mit den Ansichten ParagraphView und LabelView zu spielen und zu sehen, wie verschiedene Änderungen im Layout die Performance extrem verändern.
Wie von diesem Link vorgeschlagen, kann es vielleicht interessant sein, setCharacterAttributes durch getHighlighter (). addHighlight () zu ersetzen. Es kann schneller sein und vielleicht der Unterschied zwischen Java-Version viel reduziert werden. Ich kann es nicht testen, da es zu viel Änderung des Codes erfordert.
Ich sehe, dass bestimmte Code-Snippets SimpleDateFormat verwenden. Calendar.GetInstance und SimpleDateFormat sind bekannte Leistungsprobleme in Java 7, insbesondere wenn mehrere Threads ausgeführt werden. Versuchen Sie, SimpleDateFormat zu JodaTime zu ändern, oder ändern Sie Ihren Code, um TimeStamp (das langes Format ist) zu verwenden und einmal zu testen.
Tags und Links java swing performance java-7 java-6