2010-02-13 12 views
9

¿El oso instanceof de palabras clave con un impacto relativamente más pesado en la plataforma Android (y más speciffically los teléfonos móviles que funcionan la máquina virtual Dalvik?Impacto de 'instanceof' en Android código Java

+0

¿Por qué crees que tiene un mayor impacto en Android que en Java? –

+4

Anthony, porque es una VM completamente diferente, basada en registro en lugar de basada en la pila? –

+0

¿Por qué una instancia de crear basura? La instancia de las pruebas si un objeto es una instancia de algún tipo, no involucra la invocación de métodos ni la creación de objetos. ¿Por qué estás haciendo una pregunta sin sentido, uniéndote a conceptos VM no relacionados que no tienen ningún sentido? –

Respuesta

3

No creo instanceof lleva una impacto más fuerte en la máquina virtual Dalvik opone a la JVM.

Si tiene cualquier duda, se puede ver por sí mismo cuando se ejecuta la aplicación con una herramienta llamada Asignación Rastreador que viene de serie como una herramienta para las DDM.

+1

Eso ayudó gracias. – Michiel

1

Encontré t hat instanceof es en su mayoría más rápido (alrededor del 60-85% del tiempo). Sin embargo, este porcentaje disminuye cuando se presenta al teléfono actividad de fondo (por ejemplo, GC, tocar, botones, agitarlo, etc.) pero la instancia permanece más rápida por encima del 50% del tiempo. Cuando el número de ciclos se hace muy grande (es decir,> 1000000), la instancia de casi siempre es más rápida. El orden en que se presentan los dos bucles while (es decir, primero el bucle instanceof y luego el bucle de verificación de campo) afecta los resultados, pero instanceof permanece el más rápido.

 AbstractParticle circleParticle = new CircleParticle(); 
     int cycles = 100000 

     long now1 = System.currentTimeMillis(); 
     int i = 0; 
     while(i<cycles) { 
      if(circleParticle instanceof CircleParticle) { 
       i++; 
      } 
     } 
     long timetaken1 = (System.currentTimeMillis()-now1); 

     long now2 = System.currentTimeMillis(); 
     int j = 0; 
     while(j<cycles) { 
      if(circleParticle.type == AbstractParticle.TYPE_CIRCLE) { 
       j++; 
      } 
     } 
     long timetaken2 = (System.currentTimeMillis()-now2); 

     if(timetaken1 < timetaken2) { 
      type1won++; 
     } 
     else if(timetaken2 < timetaken1){ 
      type2won++; 
     } 

     Log.d("instanceof test","type 1 favoured : "+((float)type1won/(type1won+type2won)));   
+1

Su sameple no tiene sentido, i y j no se usan después del bucle, por lo que es muy probable que los bucles se hayan omitido al ejecutar el código ya que no tiene sentido ejecutarlos. –

+0

Comentario sabio, debería verificarlo; gracias. Sin embargo, eso me deja con preguntas: cómo uno era consustantemente más rápido y por qué el tiempo empleado aumentaba cuando aumentaban los "ciclos". Recordaré lo que indicó cuando estoy construyendo pruebas en el futuro. – Michiel

Cuestiones relacionadas