2010-09-10 12 views
5

Necesito pasar un x/y alrededor. Solo estaba usando java.awt.Point. Hago esto mucho considerando que es la naturaleza de la aplicación, pero toneladas más lento que los arreglos normales. También traté de crear mi propio "FastPoint", que es simplemente un int x/y un constructor de clases muy simple, eso también es muy lento.Por qué los puntos son lentos

El tiempo es en milésimas de segundo.

java.awt.Point: 10374
FastPoint: 10032
matrices: 1210

public class FastPoint { 

    public int x; 
    public int y; 

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

jvisualvm dice Point (ya sea AWT o mi propia) están utilizando toneladas de memoria en comparación con arreglo simple int [] .

Supongo que es solo por encima de tener que crear un objeto en lugar de un um, tipo básico? ¿Alguna forma de modificar u optimizar esta clase de puntos? Ya he cambiado a las matrices int básicas (que ahora son muchísimo más rápidas), pero solo estoy tratando de entender por qué esto es lento y si hay algo que pueda hacer al respecto.

Código de prueba:

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

No creo que el uso de matrices en lugar de Objetos resulte en un aumento de tiempo del 900%. Tiempo en ms -> pero para hacer qué? –

+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

también, en su versión de matriz, no está ** instanciando ** la matriz. El costo diferente entre crear objetos/matrices y asignar valores * a * elementos en la misma matriz es * vast *. –

Respuesta

9

Su instrumento de prueba es parcial: Se crea un nuevo punto en cada iteración, pero crear la matriz sólo una vez. Si mueve la asignación de matriz en el bucle, la diferencia no es tan grande, y las matrices son en realidad un poco más lento:

Point: 19 segundos nano/iteración

Matriz: segundos 47 nano/iteración

Esto es como se esperaba, ya que los accesos de matriz necesitan realizar comprobación de límites, pero la asignación de campos no (el JIT aparentemente ha introducido el constructor de puntos).

También tenga en cuenta que instrumentar una máquina virtual para el perfil de la CPU incurre en una sobrecarga adicional, que puede - en algunos casos drásticamente - cambiar el comportamiento de rendimiento de la aplicación bajo prueba.

Cuestiones relacionadas