2010-09-10 17 views
5

Ich muss ein x/y herumreichen. Ich habe gerade java.awt.Point benutzt. Ich mache das sehr viel, wenn man bedenkt, dass es die Art der App ist, aber viel langsamer als normale Arrays. Ich habe auch versucht, meinen eigenen "FastPoint" zu erstellen, der nur ein int x/y und sehr einfacher Klassenkonstruktor ist, der auch sehr langsam ist.Warum sind Punkte langsam

Die Zeit ist in Millisekunden.

java.awt.Point: 10374
Direkteingabe: 10032
Arrays: 1210

public class FastPoint { 

    public int x; 
    public int y; 

    public FastPoint(int x, int y) { 
      this.x = x; 
      this.y = y; 
    } 
} 

jvisualvm sagt Point (entweder AWT oder meine eigenen) sind Tonnen Speicher mit im Vergleich zu einfachen int [] array .

Ich denke, das ist nur Overhead von der Erstellung eines Objekts anstelle von einem um, Grundtyp? Gibt es eine Möglichkeit, diese Point-Klasse zu optimieren oder zu optimieren? Ich bin bereits auf basic int-Arrays umgestiegen (was jetzt viel schneller ist), versuche aber nur zu verstehen, warum das langsam ist und ob ich irgendetwas dagegen tun kann?

Testcode:

for (int i = 0; i < maxRuns; i++) { 
    point = new Point(i,i); 
} 

for (int i = 0; i < maxRuns; i++) { 
    a[0] = i; a[1] = i; 
} 
+1

Ich glaube nicht, dass die Verwendung von Arrays anstelle von Objekten zu einer 900% -Zeitsteigerung führen würde. Zeit in ms -> aber um was zu tun? –

+0

for (int i = 0; i < maxRuns; i++) { point = new Point(i,i); }for (int i = 0; i < maxRuns; i++) { a[0] = i; a[1] = i; } dime

+1

Auch, in Ihrer Array-Version, Sie sind nicht ** Instantiierung ** das Array. Die unterschiedlichen Kosten zwischen dem Erstellen von Objekten/Arrays und dem Zuordnen von Werten * zu * Elementen im selben Array sind * riesig *. –

Antwort

9

Ihr Test-Harnisch ist voreingenommen: Erstellen Sie einen neuen Punkt in jeder Iteration, aber das Array nur einmal. Wenn Sie die Array Zuweisung in die Schleife bewegen, ist der Unterschied nicht so groß, und Arrays ist tatsächlich etwas langsamer:

Point: 19 Nanosekunden/Iteration

Array: 47 Nanosekunden/Iteration

Dies ist wie erwartet, da Array-Zugriffe die Überprüfung der Grenzen durchführen müssen, aber die Feldzuweisung nicht (der JIT hat offensichtlich den Punktkonstruktor eingebunden).

Beachten Sie außerdem, dass das Instrumentieren einer virtuellen Maschine für die CPU-Profilierung zusätzlichen Overhead verursacht, der das Leistungsverhalten der zu testenden Anwendung in einigen Fällen drastisch ändern kann.