Ich bin mir bewusst, dass ein übliches Performance-Refactoring darin besteht, einfache for
s durch System.arraycopy.
Ich möchte fragen:
Wann genau macht system.arraycopy Sinn (wenn man bedenkt, dass es sich um einen nativen Methodenaufruf handelt). Sagt das Kopieren kleiner Dinge, & lt; 32 haben Sie einen Vorteil?
Ist es mein Eindruck, oder ist es nicht einfach möglich, einen solchen Zyklus mit arraycopy (effizient) zu kopieren:
%Vor%Es ist nicht schwer, System.arraycopy zu verwenden, um eine schnelle Tiefenkopie zu erstellen. Hier ist ein Beispiel für ein 2D-Array:
%Vor%Bei einem schnellen Timing-Test dauert es 40 Millisekunden, um ein 1000x1000 2D-Array 100-mal zu kopieren, während 1740 Millisekunden die offensichtlicheren zwei for-Schleifen und die Zuweisung verwenden.
Wie bei allen Performance-Timing-Fragen müssen Sie in der Umgebung, in der Sie Ihren Code ausführen möchten, wirklich Benchmarking durchführen. Verschiedene JVM-Versionen und Hardware (CPU, Speicher usw.) -Konfigurationen können unterschiedliche Ergebnisse haben. Es hängt wirklich von Ihren spezifischen Leistungsanforderungen ab.
Aber bevor Sie zu diesem Niveau der Leistungsoptimierung kommen, sollten Sie zuerst den Code klar schreiben und ihn zuerst richtig machen. Der Compiler und das JIT können mit normalen Algorithmusausdrücken viele Optimierungen für Sie vornehmen, aber manchmal können Handoptimierungen diese automatisierten Optimierungen verwirren. Nachdem Sie ein funktionierendes Produkt haben und Leistung nicht das ist, was Sie möchten, dann profilieren und arbeiten Sie nur an den Hotspots. (Obwohl manchmal für komplexeren Code müssen Sie möglicherweise Ihre Logik umgestalten und / oder ändern.)
Wenn Sie in diesem Fall ganze Arrays kopieren, verwenden Sie System.arraycopy
, da dies die Standardmethode ist. Der Compiler kann jetzt oder in Zukunft zusätzliche Optimierungen dafür bereitstellen, da die Core-APIs stark darauf angewiesen sind, dass Sie sicher sein können, dass dies von den JVM-Entwicklern immer optimal ausgeführt werden soll.
Sie müssen allerdings einige Schleifen durchlaufen, da System.arraycopy
nur ein einzelnes Array-Objekt ausführen kann und mit Java multidimensionale Arrays eigentlich Arrays von Arrays sind. Also ...
Oder Sie könnten Arrays.copyOf
verwenden, das System.arraycopy
und einige interne Reflektionen verwendet (also nicht so schnell wie direkt System.arraycopy
selbst), aber keine tiefe Kopie.