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?
http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3 puede arrojar algo de luz. Es un poco desalentador –
@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
@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. –