Effiziente System.arraycopy für mehrdimensionale Arrays

7

Ich bin mir bewusst, dass ein übliches Performance-Refactoring darin besteht, einfache for s durch System.arraycopy.

zu ersetzen

Ich möchte fragen:

  1. 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?

  2. Ist es mein Eindruck, oder ist es nicht einfach möglich, einen solchen Zyklus mit arraycopy (effizient) zu kopieren:

    %Vor%
i30817 14.01.2010, 23:40
quelle

4 Antworten

3

System.arrayCopy ist wahrscheinlich der schnellste Weg, um ein Array zu kopieren, aber es macht keine tiefen Kopien.

Es kann auch das komplexere Beispiel in Ihrer zweiten Frage nicht machen.

    
Thilo 15.01.2010, 06:48
quelle
21

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.

    
adammtlx 18.03.2012 03:19
quelle
7

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 ...

%Vor%

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.

    
Kevin Brock 15.01.2010 00:39
quelle
1

AFAIK, System.arrayCopy ist der effizienteste und beste Weg, um Ihre Arrays zu kopieren. Mir sind keine Situationen bekannt, in denen der alternative Weg zur Implementierung eigener Schleifen für direkte Kopien viel effizienter wäre.

    
Sands 15.01.2010 00:01
quelle

Tags und Links