Wenn Sie etwas schreiben, das häufig viele (1000) kleine Objekte erzeugt, sollten Sie versuchen, es für die Leistung zu minimieren? Vor allem, wenn Sie nicht wissen, auf welchem System es ausgeführt wird, von Low- bis High-End-Desktops oder sogar von Mobilgeräten. Für Handys habe ich gehört, dass das Erstellen vieler Objekte die Leistung ein wenig beeinträchtigt, obwohl ich nicht weiß, wie wahr das ist.
Ich habe ein Beispiel, das diese Idee gut zeigt. Angenommen, in einem Grafikprogramm gibt es eine Methode, die für alle Zeichnungen verwendet wird, die idealerweise aufgerufen werden drawPixel(Point)
. Es können Tausende von Punkten erstellt werden, und es kann häufig wiederholt werden, wie in einem Spiel, in dem es mehr als 60 Mal pro Sekunde aufgerufen werden kann. Alternativ drawPixel(int x, int y)
könnte verwendet werden, um die Erstellung vieler Punktobjekte zu minimieren.
In einem objektorientierten Design würde ich die Verwendung von Point bevorzugen. Die Verwendung primitiver Typen kann jedoch die Leistung erhöhen. Der Leistungsgewinn kann in den meisten Fällen vernachlässigbar sein, aber ich bin mir nicht sicher, was mobile oder ältere Maschinen betrifft. Was ist der Leistungsgewinn, wenn Sie so etwas tun, und sollte dies berücksichtigt werden?
quelle
System.getProperty("java.version")
(oder "java.vm.version") ist ein Ausgangspunkt.Antworten:
In der Regel nicht , sollten Sie nicht vermeiden Objekte aus Angst vor Leistungsverlust zu schaffen. Dafür gibt es mehrere Gründe.
Es gibt jedoch Orte, an denen es zunächst keinen Sinn macht, etwas zu einem Objekt zu machen. Das Übergeben von zwei Koordinaten an eine Zeichenroutine kann ein solcher Fall sein: Das Koordinatenpaar hat keine unabhängige Existenz, es hat keine Identität, es wird nur einmal verwendet und dann sofort verworfen usw.
Wenn dies der Fall ist, gehen Sie sicher vor und übergeben Sie zwei
int
Sekunden, anstatt sie in ein Objekt zu wickeln. Der Punkt von OOP ist nicht, dass alles ein Objekt sein muss. Der Punkt ist, dass Objekte die Entwicklung an Orten erleichtern, an denen sie die natürliche Lösung für ein Problem der Datendarstellung darstellen. Vermeiden Sie Objekte nicht dort, wo sie sinnvoll sind - stellen Sie sie nicht dort vor, wo sie keinen Sinn haben.quelle
Wenn Sie über Auswirkungen auf die Leistung nachdenken, bevor Sie Code geschrieben haben, sollten Sie davon ausgehen, dass Sie nicht wissen, was Sie tun.
Es gibt einen sehr kleinen Platz für Objekte in Java im Vergleich zu Grundelementen. Je kleiner Ihre Objekte sind, desto höher ist der Prozentsatz des Overheads. Ich habe jedoch vor langer Zeit gelernt, dass Dinge, die n verdoppeln, nichts im Vergleich zu Dingen sind, die n mit n multiplizieren.
Also ja, während Sie ein System finanzieren könnten, das die Hälfte der Größe oder sogar ein Viertel hatte, fragen Sie sich bitte, warum es Sie wirklich interessiert. Komplizierte Lösungen für dieses Problem werden nicht gut aufgenommen. Insbesondere, weil das Eintauchen in einen solchen Code verwirrend sein wird. Verwirrte Programmierer schreiben schlechten Code. Sie schreiben n mal n Code, der n log n Code sein sollte. Und sie brauchen länger, um es zu tun.
Wenn Sie mir jetzt mit einem Trick Platz sparen können, der in eine schöne Schachtel passt, in die ich die meiste Zeit nicht hineinschauen muss, können wir reden. Wenn es eine Box ist, kann ich sie gegen eine andere austauschen, wenn diese Box besser funktioniert. Ich kann sogar dafür bezahlen.
quelle
Bei der von mir durchgeführten Leistungsoptimierung ( Beispiel ) ist es für die Speicherverwaltung sehr einfach, ein Hauptschuldiger zu sein. Es ist mir egal, wie verrückt sie den neuen Operator und den Garbage Collector optimiert haben. Die schnellste Berechnung ist keine Berechnung. Wenn ich also feststelle, dass der Speichermanager einen guten Prozentsatz der Zeit in Anspruch nimmt und ich es nicht vermeiden kann, Objekte zu erstellen , finde ich einen Weg, sie wiederzuverwenden, anstatt ständig neue zu erstellen.
Ich tue dies nur , wenn ich muss Objekte. Für Grafiken normalerweise nicht. IMHO, Grafiken sollten gezogen , nicht gebaut . Sicher könnte man sagen, dass ein Bild aus Punkten, Linien, die sie verbinden, Polygonen, Text usw. besteht. Das bedeutet nicht, dass Sie keine Alternative haben , Objekte daraus zu machen, bevor Sie sie zeichnen . Ich zeichne sie einfach.
Es gibt eine Malmethode. Ich überschreibe das, zeichne alles auf eine Bitmap und blockiere dann die Übertragung auf den Bildschirm. Es sieht augenblicklich aus. Für die Mauseingabe gibt es Methoden zum Überschreiben, Erkennen von Klicken, Ziehen usw.
OOP ist aus bestimmten Gründen eine gute Idee. Diese Gründe gelten nicht in allen Situationen.
quelle
Gehen Sie voran und verwenden Sie kleine Zuordnungen. Moderne Speichermanager, insbesondere der hochoptimierte Java-Objektmanager, sind äußerst effizient. Speichern Sie wichtige Leistungsoptimierungen für ein Arbeitsprogramm.
Es ist sehr wahrscheinlich, dass die Gesamtleistung angemessen ist. Wenn Sie feststellen, dass dies nicht der Fall ist , profilieren Sie und nur dann die Leistung des Codes. In einer langen Karriere in der Softwareentwicklung habe ich gelernt, dass die Engpässe fast nie dort sind, wo Sie sie erwarten.
Ich hatte einmal ein Teammitglied mehrere Tage damit verbracht, die Suche nach Objektmitgliedern 20x schneller zu machen. Erfolg! Die beste Gesamtbeschleunigung bei der tatsächlichen Verwendung wurde jedoch in Hundertstel Prozent gemessen. Die Änderung wurde sofort zurückgesetzt, da für die Beschleunigung größere Speicherzuweisungen pro Mitglied erforderlich waren.
quelle
Es ist ganz einfach: Wenn Sie 1000 kleine Objekte benötigen, erstellen Sie 1000 kleine Objekte und sorgen sich nicht darum. Wenn Sie 100 kleine Objekte benötigen , ist das Erstellen von 1000 kleinen Objekten dumm - erstellen Sie die Objekte, die Sie benötigen, und nicht mehr.
Wenn Sie sich Sorgen um die Leistung machen (und wenn Sie sich auch keine Sorgen um die Leistung machen), sollten Sie alle Funktionen einmal an einer Stelle schreiben lassen , wodurch Ihr gesamter Code einfacher und verständlicher wird. Dann , wenn Sie ein Leistungsproblem haben, dann Messen zeigen können Sie , dass es ein Ort , an dem das Leistungsproblem geschieht, die Dinge einfacher macht, und nur einen Ort , wo Sie brauchen , um es zu ändern. Oder das Messen zeigt, dass dieser eine Ort keine Probleme verursacht, also sind Sie fertig.
quelle