2011-05-15 9 views
5

me estaba tomando un vistazo a través de la fuente de los ejemplos en la página three.js github, y me encontré con esta clase ImprovedNoise, que es básicamente una secuencia de comandos de ruido Perlin:¿Concatenar una matriz en sí mismo más rápido que recorrer la matriz para crear más índices?

https://github.com/mrdoob/three.js/blob/master/examples/js/ImprovedNoise.js

Por lo la parte superior de la función ImprovedNoise es la siguiente:

var p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10, 
     23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87, 
     174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211, 
     133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 
     89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5, 
     202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119, 
     248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232, 
     178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249, 
     14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205, 
     93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; 

for (var i=0; i < 256 ; i++) { 

    p[256+i] = p[i]; 

} 

se dará cuenta de que p se rellena con una matriz al azar ordenado de los números 0 a 255. una vez establecida la matriz p, el guión hace un bucle sobre for cada posición en la matriz y bloquea efectivamente una copia de sí mismo desde las posiciones 256 a 511. El orden es el mismo, pero los índices se cambian por 256.

Así que mi pregunta es esta: ¿es más rápido en JavaScript para recorrer una matriz como esto o simplemente hacer ...

p = p.concat(p); 
+2

¿No puedes simplemente medirlo? – Pwnna

+1

Deberías probar http://jsperf.com/ –

+1

[Benchmark] (http://jsperf.com/concat-vs-forloop) – Raynos

Respuesta

5

Es navegador dependiente :

  • Firefox 4 da concat siendo aproximadamente 1/2 tan rápido.
  • Chrome 11 le da al método concat 10 veces más rápido.
  • IE9 le da al método concat aproximadamente 3/4 tan rápido
  • Safari 5 da como resultado que el método concat sea aproximadamente 1/3 más rápido.
  • Opera 11 le da al método concat aproximadamente 1/4 más rápido.

intentarlo por sí mismo:

http://jsperf.com/concat-vs-forloop

+0

Chrome es un factor de 7 más rápido. Además, su llamada .slice hace que la comparación parezca más pequeña. Comprueba este [punto de referencia] (http://jsperf.com/concat-vs-forloop) sin el sector. – Raynos

+0

@Raynos buena llamada en la porción. Mi primera versión no la tenía y explotó porque se concatenó una y otra vez, así que opté por la solución rápida en lugar de replantear mi enfoque. Su punto de referencia es superior y editaré mi respuesta para usarlo en su lugar. – Domenic

+0

@Domenic mi benchmark muestra que concat es más lento en FF4 – Raynos

4

Bien, voy a hacer la prueba para ti. Se editará para incluir más navegadores (ejecución 1000000 de cualquiera de sus códigos). Buena prueba de navegador, también! spec Machine es 430M i5 y RAM 4 GB en win7 de 64 bits

Código de ensayo:

<script> 

function do1(){ 
p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10, 
     23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87, 
     174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211, 
     133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 
     89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5, 
     202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119, 
     248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232, 
     178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249, 
     14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205, 
     93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; 
for (var i=0; i < 256 ; i++) { 

    p[256+i] = p[i]; 

} 
} 

function do2(){ 
p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10, 
     23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87, 
     174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211, 
     133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 
     89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5, 
     202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119, 
     248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232, 
     178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249, 
     14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205, 
     93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; 
p = p.concat(p); 
} 

function timeit(func){ 
var date1 = new Date(); 
var start = date1.getTime(); 
for (i=0;i<1000000;i++) func(); 
var date2 = new Date(); 
var end = date2.getTime(); 
alert(end-start); 
} 

timeit(do1); 
//timeit(do2); // uncomment to activate 

</script> 

Chrome 11

Método 1 (circular):

  • 4669ms
  • 4809ms
  • 5103ms
  • 5025ms
  • 4786ms

Método 2 (concat):

  • 387ms
  • 370ms
  • 494ms
  • 640ms
  • 394ms

Opera 11.1 (3 pruebas .. toma a largo)

Método 1 (circular)

  • 7884 ms
  • 7621 ms
  • 7546 ms

Nota: para uno de mi carrera obtuve> 98000ms .. IDK qué pasó.

Método 2 (concat)

  • 27684 ms
  • 28479 ms
  • 23,539 ms

IE 9

Método 1 (bucle)

  • 6065ms
  • 6026ms
  • 6214ms

Método 2 (concat)

  • 8064 ms
  • 8105 ms
  • 7954 ms
3

No es necesario duplicar la matriz en absoluto, sólo tiene que utilizar p [i% 256] para acceder a sus miembros numéricos.

+0

Esto es asombroso. +1 por pensar fuera de la caja! – treeface

Cuestiones relacionadas