2012-03-02 8 views
6

He jugado con jsperf.com y hallaron que la función prototipo es 40x más lento que "por defecto" función declarada.¿Por qué el prototipo funciona 40 veces más lento que la función declarada por defecto?

String.prototype.contains = function(s){ return !!~this.indexOf(s) } = ops 220K/s

vs.

function isContains(str, s) { return !!~str.indexOf(s) } ops = 8.5KK/s

Here's a jsperf test case

P.S. Sé que la modificación de prototipo no es el mejor caso y se puede llamar 'parche de monos' :)

+0

mira esto, afecta de cuerda y número de literales, pero no literales de matriz - http://jsperf.com/shoop-da-whoop –

+0

solo cuando se agrega un prototipo a Clases conocidas. http://stackoverflow.com/questions/32847086/javascript-performance-of-extinging-string-prototype-is-abysmal-vs-static-funct – Omeriko

Respuesta

6

Creo que es lento porque la primitiva de cadena se envuelve automáticamente con un objeto temporal cada vez que se llama.

Esto también explica el aumento de rendimiento de new Object("hi").foo() sobre "hi".foo().

Desde el MDN docs:

literales de cadena (denotados por comillas simples o dobles) y cadenas de regresar de cuerdas llamadas en un contexto no-constructor (es decir, sin necesidad de utilizar la nueva palabra clave) son cadenas primitivas. JavaScript convierte automáticamente objetos primitivos y objetos String, de modo que es posible usar métodos de objetos String para cadenas primitivas. En contextos en los que se debe invocar un método en una cadena primitiva o se produce una búsqueda de propiedad, JavaScript ajustará automáticamente la primitiva de cadena y llamará al método o realizará la búsqueda de propiedades.

Cerca:

Why can't I add properties to a string object in javascript?

String object versus literal - modifying the prototype?

+0

¡Perdón por el fuera de tema! Pero, hiciste una cosa llamada ['decl'] (http://gitbuh.github.com/decl/) que me gustó, y mientras jugaba con ella noté que no parece ejecutarse en IE8 (o eso, o el arnés 'detest' (¡genial nombre!) no funciona, [la página] (http://gitbuh.github.com/decl/site/test.html) se ve raro en IE8). Así que sí, hice una sala de chat en caso de que tuvieras unos momentos para decirme cuál podría ser la causa (estoy dispuesto a hackearlo), y para no contaminar esta área de comentarios. [Aquí] (http://chat.stackoverflow.com/rooms/17017/room-for-camilo-martin-and-ggg). Y felicitaciones :) –

1

Las probabilidades son muy buenas de que está reemplazando una función primitiva implementada en C/código de máquina con un cuerpo de JavaScript en el mono versión parcheada

+1

No entiendo lo que quieres decir. '" ".contains' no existe ... ¿qué función nativa crees que está ocultando? –

+0

Supongo que el envío del prototipo está frustrando la capacidad de la implementación para obtener una versión eficiente de indexOf(). La magia es una diferencia de 40x, que huele a interpretación versus código compilado. –

+0

¿Cómo explicaría la revisión 4 de CMS y mi revisión 5 de la evaluación? Estoy totalmente perdido aquí. –

Cuestiones relacionadas