Die meisten Entwickler halten es für selbstverständlich, dass die Leistungsoptimierung komplex ist und viel Erfahrung und Wissen erfordert. Nun, es kann nicht gesagt werden, dass dies völlig falsch ist. Die Optimierung Ihrer Anwendung für eine optimale Leistung ist keine leichte Aufgabe. Dies bedeutet jedoch nicht, dass Sie nichts tun können, wenn Sie dieses Wissen nicht haben. Hier sind 11 einfachere Tipps und Best Practices, mit denen Sie eine gut leistungsfähige Anwendung erstellen können.
Die meisten Vorschläge sind für Java. Es gibt jedoch mehrere Vorschläge, die sprachunabhängig sind und auf alle Anwendungen und Programmiersprachen angewendet werden können. Bevor Sie die Leistungsabstimmungstechniken speziell für Java diskutieren, schauen wir uns allgemeine Tipps an.
1. Optimieren Sie nicht, bis Sie wissen, dass es notwendig ist
Dies ist wahrscheinlich eine der wichtigsten Tipps zur Leistungsstimmung. Sie sollten gemeinsame Best Practices befolgen und versuchen, Ihre Anwendungsfälle effizient zu implementieren. Dies bedeutet jedoch nicht, dass Sie eine Standardbibliothek ersetzen oder komplexe Optimierungen erstellen sollten, bevor Sie sich als notwendig erweisen.
In den meisten Fällen dauert die vorzeitige Optimierung nicht nur viel Zeit, sondern es wird auch schwierig, den Code zu lesen und zu warten. Schlimmer noch, diese Optimierungen bringen normalerweise keine Vorteile, denn das, was Sie viel Zeit damit verbringen, ist der nicht kritische Teil der Anwendung.
Wie beweisen Sie also, dass Sie etwas optimieren müssen?
Zunächst müssen Sie definieren, wie schnell Ihr Anwendungscode beispielsweise eine maximale Reaktionszeit für alle API -Aufrufe angibt oder die Anzahl der in einem bestimmten Zeitbereich importierten Datensätze angibt. Sobald Sie dies getan haben, können Sie messen, welche Teile der Anwendung zu langsam sind, um sich zu verbessern. Schauen wir uns dann den zweiten Trick an.
2. Verwenden Sie den Analysator, um den echten Engpass zu finden
Nachdem Sie den ersten Vorschlag befolgt und festgestellt haben und festgestellt haben, dass einige Teile der Anwendungsverbesserung verbessert werden müssen, wo Sie anfangen sollen?
Sie können das Problem auf zwei Arten lösen:
Schauen Sie sich Ihren Code an und beginnen Sie mit dem Teil, das misstrauisch aussieht oder Sie glauben, dass sie problematisch sind.
Oder verwenden Sie den Analysator und erhalten Sie detaillierte Informationen über das Verhalten und die Leistung jedes Teils des Codes.
Hoffentlich muss ich nicht erklären, warum ich immer der zweiten Methode folgen sollte.
Es ist offensichtlich, dass ein Parser-basierter Ansatz es Ihnen ermöglicht, die Leistungsauswirkungen Ihres Codes besser zu verstehen und sich auf die kritischsten Teile zu konzentrieren. Wenn Sie einen Parser verwendet haben, müssen Sie sich daran erinnern, wie überrascht Sie herausgefunden haben, welche Teile des Codes Leistungsprobleme hatten. Um ehrlich zu sein, hat mich meine erste Vermutung mehr als einmal in die falsche Richtung geführt.
3. Erstellen Sie eine Leistungstestsuite für die gesamte Anwendung
Dies ist ein weiterer universeller Tipp, der Ihnen helfen kann, viele unerwartete Probleme zu vermeiden, die nach dem Einsatz von Leistungsverbesserungen der Produktion häufig auftreten. Sie sollten immer eine Leistungstestsuite definieren, in der die gesamte Anwendung getestet und vor und nach Leistungsverbesserungen ausgeführt wird.
Diese zusätzlichen Testläufe helfen Ihnen dabei, die Nebenwirkungen der Veränderungen und der Leistung der Änderungen zu identifizieren und sicherzustellen, dass keine Schäden als gute Aktualisierungen verursacht werden. Dies ist besonders wichtig, wenn Sie an Komponenten arbeiten, die von verschiedenen Teilen der Anwendung verwendet werden, z. B. Datenbanken oder Caches.
4. Deal mit dem größten Engpass
Nachdem Sie eine Testsuite erstellt und die Anwendung mit dem Analysator analysiert haben, können Sie eine Reihe von Problemen auflisten, die angegangen werden müssen, um die Leistung zu verbessern. Das ist großartig, aber es beantwortet die Frage immer noch nicht, wo Sie anfangen sollten. Sie können sich auf schnell wirkende Lösungen konzentrieren oder mit den wichtigsten Fragen beginnen.
Schnell wirkende Programme können zunächst attraktiv sein, da Sie schnell das erste Ergebnis zeigen können. Manchmal müssen Sie jedoch möglicherweise andere Teammitglieder oder Management davon überzeugen, dass sich die Leistungsanalyse lohnt - da es momentan keinen Einfluss gibt.
Insgesamt empfehle ich jedoch zuerst mit den wichtigsten Leistungsproblemen. Dies bietet Ihnen die größten Leistungsverbesserungen und muss möglicherweise einige dieser Probleme nicht mehr lösen, um die Leistungsanforderungen zu erfüllen.
Häufige Tipps zur Leistungsstimmung enden hier. Schauen wir uns einige Java-spezifische Tipps genauer an.
5. Verwenden Sie StringBuilder, um die Zeichenfolge programmatisch zu verbinden
Es gibt viele verschiedene Optionen, um Saiten in Java zu verbinden. Beispielsweise können Sie einfach + oder + = sowie StringBuffer oder StringBuilder verwenden.
Welche Methode sollten Sie wählen?
Die Antwort hängt vom Code ab, der die Zeichenfolge verbindet. Wenn Sie einem String programmgesteuert neue Inhalte hinzufügen, beispielsweise in einer für die Loop, sollten Sie StringBuilder verwenden. Es ist einfach zu bedienen und bietet eine bessere Leistung als StringBuffer. Denken Sie jedoch daran, dass StringBuilder im Vergleich zu StringBuffer nicht mit Thread-Sicherheit ist und für alle Anwendungsfälle möglicherweise nicht geeignet ist.
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 angeschlossene Zeichenfolge abzurufen.
Das folgende Code -Snippet zeigt ein einfaches Beispiel. Während jeder Iteration konvertiert diese Schleife I in eine Zeichenfolge und fügt sie zusammen mit einem Speicherplatz zu StringBuilder SB hinzu. Also schreibt dieser Code am Ende "Dies ist ein Test0 1 2 3 4 5 6 7 8 9" in der Protokolldatei.
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 dem Konstruktor das erste Element der Zeichenfolge bereitstellen. Dadurch wird ein neuer StringBuilder erstellt, der die bereitgestellte Zeichenfolge und 16 zusätzliche Zeichenkapazitäten enthält. Wenn Sie dem StringBuilder mehr Zeichen hinzufügen, erhöht der JVM die Größe des StringBuilders dynamisch.
Wenn Sie bereits wissen, wie viele Zeichen Ihr String enthalten wird, können Sie diese Nummer an verschiedene Konstruktoren zur Verfügung stellen, um einen StringBuilder mit definierter Kapazität zu instanziieren. Dies verbessert die Effizienz weiter, da es keine dynamische Expansion seiner Kapazität erfordert.
6. Verwenden Sie +, um die Zeichenfolge in einer Anweisung zu verkettet
Wenn Sie Ihre erste Anwendung in Java implementieren, hat Ihnen möglicherweise jemand mitgeteilt, dass Sie keine Verbindung zur String verwenden sollten. Wenn Sie Strings in Anwendungslogik verkettet, ist dies richtig. Saiten sind unveränderlich und die Ergebnisse der Verkettung jeder Zeichenfolge werden in einem neuen String -Objekt gespeichert. Dies erfordert zusätzlichen Speicher und verlangsamt Ihre Anwendung, insbesondere wenn Sie mehrere Zeichenfolgen innerhalb einer Schleife verkettet.
In diesen Fällen sollten Sie Tipp 5 folgen und StringBuilder verwenden.
Wenn Sie die Zeichenfolge jedoch nur in mehrere Zeilen aufteilen, um die Lesbarkeit Ihres Codes zu verbessern, ist dies anders.
Abfrage q = em.createquery ("Select A.id, A.Firstname, A. Lastname"
+ "Vom Autor A"
+ "Wo a.id =: id");
In diesen Fällen sollten Sie ein einfaches + verwenden, um Ihre Zeichenfolge zu verkettet. Der Java -Compiler optimiert dies und führt Verbindungen zur Kompilierungszeit durch. Zur Laufzeit verwendet Ihr Code also nur 1 String und es ist keine Verbindung erforderlich.
7. Verwenden Sie so weit wie möglich Primitive
Eine weitere einfache und schnelle Möglichkeit, Overhead zu vermeiden und die Anwendungsleistung zu verbessern, besteht darin, den Grundtyp anstelle seiner Wrapper -Klasse zu verwenden. Daher ist es am besten, int anstelle von Ganzzahl und doppelt anstatt doppelt zu verwenden. Dies ermöglicht es dem JVM, Werte auf dem Stapel zu speichern und nicht auf dem Haufen, um den Speicherverbrauch zu verringern und eine effizientere Verarbeitung zu gestalten.
8. Versuchen Sie, BigInteger und Bigdecimal zu vermeiden
Da wir Datentypen diskutieren, schauen wir uns einen kurzen Blick auf BigInteger und Bigdecimal. Letzteres ist insbesondere für seine Genauigkeit beliebt. Aber es gibt einen Preis.
Biginteger und BigDecimal erfordern mehr Speicher als einfaches langes oder doppeltes und werden alle Berechnungen erheblich verlangsamen. Wenn Sie also zusätzliche Präzision benötigen oder die Zahlen die Langstrecke überschreiten, ist es am besten, zweimal zu überlegen, bevor sie dies tun. Dies ist wahrscheinlich die einzige Möglichkeit, sich zu ändern, um Leistungsprobleme zu lösen, insbesondere bei der Implementierung mathematischer Algorithmen.
9. Überprüfen Sie zuerst die aktuelle Protokollebene
Dieser Vorschlag sollte offensichtlich sein, aber leider ignorieren viele Programmierer ihn beim Schreiben von Code meist. Bevor Sie eine Debug -Nachricht erstellen, sollten Sie zuerst die aktuelle Protokollebene überprüfen. Andernfalls können Sie eine Protokollnachrichtzeichenfolge erstellen, die später ignoriert wird.
Hier sind zwei negative Beispiele.
// 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 erforderlichen Schritte aus, um eine Protokollnachricht zu erstellen, ohne zu wissen, ob das Protokoll -Framework die Protokollnachricht verwendet. Daher ist es am besten, die aktuelle Protokollebene zu überprüfen, bevor Sie eine Debug -Nachricht erstellen.
// do thisif (log.isdebugenabled ()) {log.debug ("user [" + userername + "] Methode X mit [" + i + "]");} genannt;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 bei Java 9. Wenn Ihre Anwendung jedoch viele Ersatzvorgänge erfordert und nicht auf die neueste Java -Version aktualisiert wird, ist es weiterhin erforderlich, schnellere und effizientere Alternativen zu finden.
Es gibt eine alternative Antwort auf Apache Commons Langs Stringutils.replace -Methode. Wie Lukas Eder in einem kürzlich veröffentlichten Blog -Beitrag beschrieben hat, ist die Stringutils.replace -Methode der String.Replace -Methode von Java 8 weit überlegen.
Und es erfordert nur geringfügige Änderungen. Das heißt, fügen Sie die Maven -Abhängigkeiten des Apache Commons Lang -Projekts zum Anwendungs -pom.xml hinzu und ersetzen Sie alle Aufrufe an die methode der String.replace -Methode.
// 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 gemeinsamer Code -Snippets zu vermeiden. Die allgemeine Idee ist einfach: Es ist billiger, diese Ressourcen wiederzuverwenden, als wiederholt neue Ressourcen zu erstellen.
Ein typisches Beispiel ist eine Datenbankverbindung in einem Cache -Pool. Neue Verbindungen brauchen Zeit, um zu erstellen, was vermieden werden kann, wenn Sie vorhandene Verbindungen wiederverwenden.
Sie können auch andere Beispiele in der Java -Sprache selbst finden. Zum Beispiel kann die Wertmethode der Ganzzahlklasse die Werte zwischen -128 und 127 zwischengespeichert. Sie können sagen, dass die Erstellung einer neuen Ganzzahl nicht zu teuer ist, aber da sie häufig verwendet wird, kann das zwischen den am häufigsten verwendeten Werten auch Leistungsvorteile bieten.
Denken Sie jedoch daran, dass Cache -Implementierungen auch Overhead anfallen können. Sie müssen zusätzlichen Speicher ausgeben, um wiederverwendbare Ressourcen zu speichern. Möglicherweise müssen Sie Caches verwalten, um Ressourcen zugänglich zu machen und veraltete Ressourcen zu löschen.
Bevor Sie Ressourcen zwischen den Ressourcen zwischenstrichen, müssen Sie sie genug verwenden, wenn Sie den Cache implementieren, das heißt, Sie müssen sie genug verwenden.
Zusammenfassen
Wie Sie sehen können, braucht es manchmal nicht viel Arbeit, um die Leistung Ihrer Anwendung zu verbessern. Die meisten Vorschläge in diesem Artikel erfordern nur ein wenig Aufwand, um sie auf Ihren Code anzuwenden.
Das Wichtigste sind jedoch die Tricks, die nicht mit der Programmiersprache zusammenhängen:
Optimieren Sie nicht die Verwendung von Analysatoren, um echte Engpässe zu finden, bevor Sie wissen, dass dies erforderlich ist. Erstes mit den größten Engpässen.
Das obige Inhalt ist in diesem Artikel über die sehr einfachen und leicht verständlichen Java-Performance-Tuning-Techniken. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Java implementiert einen detaillierten Code für die Freigabe von Funktionen von WeChat Public Platform WeChat Momente
Vergleichende Analyse von Leistungsinstanzen der Java Native Serialization und der Kryo -Serialisierung
Untersuchung darüber, ob die Java -Programmierunterklasse die statische Methode der übergeordneten Klasse umschreiben kann
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!