2011-12-06 10 views
5

He estado usando algún código para extraer valores de 16 bits sin firmar de una cadena.Javascript: bajo rendimiento en V8 de funciones agregadas a String.prototype?

he descubierto que la adición de esta función para el prototipo de String:

String.prototype.UInt16 = function(n) { 
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1); 
}; 

es mucho más lento que sólo tener una función que toma un String como parámetro:

var UInt16 = function(s, n) { 
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1); 
}; 

En Firefox la diferencia es solo un factor de dos, pero en Chrome 15 es cien veces más lento!

Ver resultados en http://jsperf.com/string-to-uint16

Puede alguien proferir una explicación para esto, y/u ofrecer una forma alternativa de utilizar el prototipo sin el impacto en el rendimiento?

+3

http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3 puede arrojar algo de luz. Es un poco desalentador –

+0

@CrescentFresh, mira mi respuesta, todavía es mucho más lento y no "dentro del 1%" como se afirma en el hilo al usar objetos ... ¿O tal vez lo estoy haciendo mal? – Esailija

+0

@Esailija: No veo la relación de su respuesta a la pregunta. Sus adiciones a los casos de prueba simplemente muestran (como cubre la discusión del grupo de Google) que guardar una referencia a un objeto 'String' produce resultados más rápidos cuando se llaman métodos prototipados en ese objeto que llamando al mismo método en una primitiva. El problema fundamental que el OP está tratando de abordar tiene que ver con la coerción de tipo implícita al encapsular una primitiva a un objeto repetidamente. –

Respuesta

1

Acceder al prototipo desde una primitiva (porque no es un objeto) es mucho más lento que acceder al prototipo desde un objeto.

http://jsperf.com/string-to-uint16/2

10 veces más rápido en cromo y 2 veces más rápido en Firefox para mí.

¿Hay un cuello de botella real en el uso del prototipo? Todavía es muy rápido si no necesitas millones de operaciones por segundo. Si lo necesita, simplemente use una función.

0

Alnitak, hice un jsperf rápida test (que publiqué accidentalmente), y se nota que los prototipos a tipos de usuario no son más lento. Al considerar el funcionamiento de los motores como el V8, tiene sentido que la compilación de Java se comporte de manera muy diferente al agregar código a los objetos incorporados.

Cuestiones relacionadas