Die meisten Entwickler glauben, dass die Leistungsoptimierung ein relativ komplexes Thema ist und viel Erfahrung und Wissen erfordert. Ja, daran ist nichts auszusetzen. Zugegeben, die Optimierung Ihrer Anwendung für die beste Leistung ist keine leichte Aufgabe, aber das bedeutet nicht, dass Sie nichts tun können, ohne diese Erfahrung und dieses Wissen zu sammeln. Hier sind einige einfachere Tipps und Best Practices, mit denen Sie eine gut leistungsfähige Anwendung erstellen können.
Die meisten dieser Vorschläge basieren auf Java, aber nicht unbedingt, und einige können auf alle Anwendungen und Programmiersprachen angewendet werden. Bevor wir Java-basierte Leistungsstimmtipps teilen, diskutieren wir diese allgemeinen Tipps zur Leistungsstimmung.
1. optimieren Sie nicht vor nötig
Dies ist wahrscheinlich eine der wichtigsten Tipps zur Leistungsstimmung. Sie sollten gemeinsame Best Practices befolgen und versuchen, Ihre Anwendungsfälle effektiv zu implementieren. Dies bedeutet jedoch nicht, dass eine Standardbibliothek ersetzt oder komplexe Optimierungen erstellt wird, bevor beweist, dass dies erforderlich ist.
In den meisten Fällen nimmt die vorzeitige Optimierung viel Zeit in Anspruch, sodass der Code schwierig ist, das Lesen und Wartung zu machen. Schlimmer noch, diese Optimierungen bringen normalerweise keine Vorteile, da Sie viel Zeit damit verbringen, nicht kritische Teile Ihrer Anwendung zu optimieren.
Wie beweisen Sie also, dass Sie etwas optimieren müssen?
Zunächst müssen Sie die Geschwindigkeit Ihres Anwendungscodes ermitteln, z. B. eine maximale Antwortzeit für alle API -Aufrufe angeben oder die Anzahl der Datensätze angeben, die über einen bestimmten Zeitbereich importiert werden sollen. Sobald Sie fertig sind, können Sie messen, welche Teile der Anwendung zu langsam sind, um sich zu verbessern. Danach sehen Sie sich dann weiter auf den zweiten Stimmspitzen.
2. Verwenden Sie den Analysator, um den echten Engpass zu finden
Nachdem Sie den ersten Ratschlägen befolgt haben und festgestellt haben, dass einige Teile Ihrer Bewerbung verbessert werden müssen, fragen Sie sich, wo Sie anfangen sollen?
Sie können dieses Problem auf zwei Arten lösen:
Warum sollte die zweite Methode immer befolgt werden.
Die Antwort sollte offensichtlich sein, und mit dem Analysator-basierten Ansatz können Sie die Leistung Ihres Codes besser verstehen und sich auf die kritischsten Teile konzentrieren. Wenn Sie jemals einen Parser verwendet haben, werden Sie überrascht sein, welche Teile des Codes Leistungsprobleme verursachen. Viele Male wird Sie jedoch Ihre erste Vermutung in die falsche Richtung führen.
3. Erstellen Sie eine Leistungstestsuite für die gesamte Anwendung
Dies ist ein weiterer allgemeiner Trick, der Ihnen hilft, viele unerwartete Probleme zu vermeiden, die häufig nach Leistungsverbesserungen in einer Produktionsumgebung eingesetzt werden. Sie sollten häufig eine Leistungstestsuite definieren, in der die gesamte Anwendung getestet und vor und nach Abschluss der Leistungsverbesserung ausgeführt wird.
Diese zusätzlichen Testläufe helfen Ihnen dabei, die Funktions- und Leistungsauswirkungen der Änderung zu identifizieren und sicherzustellen, dass Sie kein Update veröffentlichen, das mehr Schaden als nützt. Dies ist besonders wichtig, wenn Ihre Aufgaben auf mehreren verschiedenen Teilen der Anwendung ausgeführt werden, z. B. Datenbank oder Cache.
4. Lösen Sie zuerst das größte Engpassproblem
Nach dem Erstellen der Testsuite und der Verwendung des Analysators zur Analyse der Anwendung haben Sie eine Liste von Fragen, die die Leistung verbessern müssen, was großartig ist, die Frage jedoch nicht beantwortet, wo Sie beginnen sollten. Sie können mit denen beginnen, die schnell durchgeführt werden können, oder mit den wichtigsten Fragen beginnen.
Natürlich ist der erstere sehr verlockend, weil sie bald Ergebnisse erzielen wird. Manchmal kann es notwendig sein, andere Teammitglieder oder Ihr Management davon zu überzeugen, dass sich die Leistungsanalyse lohnt.
Insgesamt schlage ich jedoch vor, zuerst mit den wichtigsten Leistungsproblemen zu beginnen. Auf diese Weise erhalten Sie die größten Leistungsverbesserungen, und Sie müssen möglicherweise nur einige dieser Probleme beheben, um Ihre Leistungsanforderungen zu lösen.
Nach dem Verständnis der allgemeinen Leistungsstimmungstechniken schauen wir uns einige Java-spezifische Tuning-Techniken genauer an.
5. Verwenden Sie StringBuilder, um Strings programmgesteuert zu verbinden
Es gibt viele verschiedene Optionen, um Saiten in Java zu verbinden. Sie können beispielsweise einen einfachen + oder + = einen alten StringBuffer oder StringBuilder verwenden.
Welche Methode sollten Sie wählen?
Die Antwort hängt von dem Code ab, der die Zeichenfolge verbindet. Wenn Sie programmgesteuert einen neuen Inhalt zu einer Zeichenfolge hinzufügen, sollten Sie beispielsweise StringBuilder verwenden. Es ist einfacher zu bedienen und bietet eine bessere Leistung als StringBuffer. Denken Sie jedoch daran, dass StringBuilder sich von StringBuffer unterscheidet. Es ist nicht mit Thread-Sicherheit und ist möglicherweise nicht für alle Anwendungsfälle geeignet.
Sie müssen nur einen neuen StringBuilder instanziieren und die Append -Methode aufrufen, um der Zeichenfolge einen neuen Teil hinzuzufügen. Nachdem Sie alle Teile hinzugefügt haben, können Sie die Methode toString () aufrufen, um die Verbindungszeichenfolge abzurufen.
Das folgende Code -Snippet zeigt ein einfaches Beispiel. Während jeder Iteration wandelt sich diese Schleife I in eine Zeichenfolge um und fügt sie dem Speicherplatz von StringBuilder SB hinzu. Am Ende wird dieser Code in "Dies ist test0123456789" in die Protokolldatei geschrieben.
StringBuilder sb = new StringBuilder ("Dies ist ein Test"); für (int i = 0; i <10; i ++) {sb.append (i); sb.append ("");} log.info (sb.toString ());Wie Sie im Code -Snippet sehen können, können Sie das erste Element der Zeichenfolge für die Konstruktormethode bereitstellen. Dadurch wird ein neuer StringBuilder mit der bereitgestellten Zeichenfolge und 16 zusätzlichen Zeichenkapazitäten erstellt. Wenn Sie dem StringBuilder mehr Zeichen hinzufügen, ändert der JVM die Größe des StringBuilders dynamisch.
Wenn Sie bereits wissen, wie viele Zeichen Ihre Zeichenfolge enthält, können Sie diese Nummer für verschiedene Konstruktormethoden zur Instanziierung eines StringBuilders mit definierter Kapazität bereitstellen. Dies verbessert seine Effizienz weiter, da es seine Kapazität nicht dynamisch erweitert.
6. Verwenden Sie +Verbindungszeichenfolge in der Deklaration
Wenn Sie Ihre erste Bewerbung in Java implementieren, sagt Ihnen möglicherweise jemand, dass Sie nicht verwenden sollten, um Zeichenfolgen zu verkettet. Dies ist korrekt, wenn Sie die Zeichenfolge in der Anwendungslogik anschließen. Saiten sind unveränderlich und das Ergebnis jeder String -Verkettung wird in einem neuen String -Objekt gespeichert. Dies erfordert zusätzlichen Speicher und verlangsamt die Anwendung, insbesondere bei der Verkettung mehrerer Zeichenfolgen in einer Schleife.
In diesen Fällen sollten Sie Tipp 5 folgen und StringBuilder verwenden.
Wenn Sie jedoch nur eine Zeichenfolge in mehrere Zeilen unterteilen, um die Lesbarkeit Ihres Codes zu verbessern, ist dies nicht der Fall.
Abfrage q = em.createquery ("SELECT A.ID, A.Firstname, a.lastname"+ "vom Autor a"+ "wobei A.id =: id");In diesen Fällen sollten Sie ein einfaches + verwenden, um Ihre Zeichenfolge zu verkettet. Der Java -Compiler optimiert es und führt Verbindungen zur Kompilierungszeit durch. Zur Laufzeit verwendet der Code daher nur 1 Zeichen und erfordert keine Verkettung.
7. Verwenden Sie so weit wie möglich grundlegende Datentypen
Eine weitere schnelle Möglichkeit, Overhead zu vermeiden und die Anwendungsleistung zu verbessern, besteht darin, primitive Datentypen anstelle ihrer Wrapper -Klassen zu verwenden. Daher ist es besser, int anstelle von Ganzzahl oder doppelt anstelle von doppelt zu verwenden. Dadurch kann der JVM den Wert auf dem Stapel speichern, um den Speicherverbrauch zu verringern und effizienter zu behandeln.
8. Versuchen Sie, BigInteger und Bigdecimal zu vermeiden
Da wir Datentypen besprochen haben, schauen wir uns BigInteger und Bigdecimal an. Letzteres ist insbesondere aufgrund seiner hohen Präzision beliebt. Aber es gibt einen Preis.
Biginteger und BigDecimal erfordern mehr Speicher als ein einfaches langes oder doppeltes und reduzieren die gesamte Berechnungsgeschwindigkeit erheblich. Wenn Sie also zusätzliche Präzision benötigen oder Ihre Zahlen über eine große Reichweite liegen, denken Sie am besten zweimal nach, bevor Sie es tun. Dies ist wahrscheinlich der einzige Ort, an dem Sie Ihr Problem der Leistungsverbesserung ändern müssen, insbesondere wenn Sie einen mathematischen Algorithmus implementieren.
9. Überprüfen Sie zuerst die aktuelle Protokollebene
Dieser Vorschlag ist offensichtlich, aber leider werden Sie feststellen, dass viele Codes ihn ignorieren. Bevor Sie eine Debug -Nachricht erstellen, sollten Sie zuerst die aktuelle Protokollebene überprüfen.
Hier sind zwei Beispiele, um zu veranschaulichen, dass Sie dies nicht tun sollten.
// that log.debug nicht ("user [" + userername + "] Method X mit [" + i + "]"); // oder thislog.debug (string.format ("Benutzer [%s] Methode X mit [%d]", Benutzername, i));In beiden Fällen führen Sie alle Schritte aus, die Sie zur Erstellung der Protokollnachricht erstellen müssen, ohne zu wissen, ob das Protokoll -Framework die Protokollnachricht verwendet. Bevor Sie eine Debug -Nachricht erstellen, können Sie zuerst die aktuelle Protokollebene überprüfen.
10. Verwenden Sie Apache Commons Stringutils.replace anstelle von String.replace
Im Allgemeinen funktioniert die Methode für String.replace gut und ist sehr effizient, insbesondere wenn Sie Java 9 verwenden. Wenn die Anwendung jedoch viele Ersatzvorgänge erfordert und Sie nicht auf die neueste Java -Version aktualisiert haben, ist es immer noch sinnvoll, nach schnelleren und effizienteren Alternativen zu suchen.
Ein Kandidat ist die APache Commons Langs Stringutils.replace -Methode. Wie Lukas Eder kürzlich in einem Blog -Beitrag beschrieben hat, überwiegt es die String -Replace -Methode von Java 8 erheblich.
Es erfordert nur eine kleine Veränderung. Sie müssen nur eine Maven -Abhängigkeit zu Ihrem App pom.xml für das Commons Lang -Projekt des Apache hinzufügen und alle Aufrufe an String.Replace -Methoden mit Stringutils.Replace -Methoden ersetzen.
// todtest.replace ersetzen ("test", "einfacher test"); // mit thisstringutils.replace (test, "test", "einfacher Test");11. Cache teure Ressourcen wie Datenbankverbindungen
Caching ist eine beliebte Lösung, um eine wiederholte Ausführung teurer oder häufig verwendeter Codeausschnitte zu vermeiden. Die allgemeine Idee ist einfach: Es ist viel billiger, diese Ressourcen wiederzuverwenden, als immer wieder eine neue Ressource zu erstellen.
Ein typisches Beispiel sind Cache -Datenbankverbindungen in einem Pool. Das Erstellen einer neuen Verbindung braucht Zeit und kann vermieden werden, wenn eine vorhandene Verbindung wiederverwendet wird.
Andere Beispiele finden sich auch in der Java -Sprache selbst. Zum Beispiel kann die Wertmethode der Ganzzahlklasse die Werte zwischen -128 und 127 zwischengespeichert. Sie könnten sagen, dass das Erstellen einer neuen Ganzzahl nicht zu teuer ist, aber häufig verwendet wird und das zwischen den am häufigsten verwendeten Werten zwischen den am häufigsten verwendeten Werten zu liefern.
Wenn Sie jedoch an das Caching nachdenken, denken Sie daran, dass Cache -Implementierungen auch Overhead entstehen können. Sie müssen zusätzlichen Speicher ausgeben, um wiederverwendbare Ressourcen zu speichern. Möglicherweise müssen Sie Ihren Cache verwalten, um Ressourcen zum Zugriff auf oder zu veraltete Ressourcen zu ermöglichen.
Bevor Sie mit dem zwischenstrichenen Ressourcen beginnen, sollten Sie sie häufig verwenden.
Zusammenfassen
Wie Sie sehen können, erfordert die Verbesserung der Leistung Ihrer Anwendung manchmal nicht viel Arbeit. Die meisten Vorschläge in diesem Artikel erfordern tatsächlich ein wenig Aufwand, um sie auf den Code anzuwenden.
Der wichtigste Rat ist jedoch, dass es sehr programmiersprachunabhängig ist:
Original -Link: 11 einfache Java Performance Tuning -Tipps (Editor/Wei Wei)