2012-09-19 21 views
38

Hace unos meses this article señaló que las clases realmente podrían evitarse juntas desde el desarrollo del sitio web.¿Los selectores css de atributo de datos son más rápidos que los selectores de clase?

Mi pregunta es, ¿qué tan eficientes son los selectores de datos en comparación con los selectores de clase?

Un ejemplo simple sería comparar la consulta de elementos con data-component='something' frente a elementos con class='class1 class2 something anotherClass'.

El selector [data-<attr>='<value>'] comprobará el valor como un todo frente a la cadena de clase que se debe dividir. Con esto en mente, los atributos de datos deberían ser más rápidos.

Por lo tanto, para refinar la pregunta, en el caso de CSS, ¿nos va mejor con selector de clase o selector de datos? Y desde un punto de vista de javascript, ¿será jQuery("[data-component='something']") más eficiente que jQuery(".something")?

+1

no sé qué tipo de la programación web es relevante para la sofistería de ese artículo, pero estoy bastante seguro de que no tiene nada que ver con lo que hago. Además, si lees ese artículo de cerca, sospecho que su autor tendría tanta preocupación con los atributos 'data-' como con las clases; ambos representan el mismo "crimen" después de todo. – Pointy

+0

En cuanto a su pregunta, algunas pruebas [jsperf] (http://jsperf.com) pueden ayudar a responder la pregunta. Sospecho que cualquier navegador moderno con 'querySelectorAll()' etc. tendrá poca dificultad con cualquiera de los enfoques. – Pointy

+0

Cuanto más pienso en los atributos de los datos y los diseño en lugar de agregar clases, más me gustan. Por ejemplo, el hecho de que un elemento de bloque (como un cuadro de búsqueda) esté oculto puede indicarse mediante el estado de datos = 'oculto'. Me parece más fácil para mí, un desarrollador para leer, que "componente widget-encabezado tangible oculto redondeado-superior". –

Respuesta

21

No lo llamaría concluyente , pero parece que los selectores de clase son más rápidos ... Acabo de armar esto para una prueba rápida.

http://jsperf.com/data-selector-performance

EDITAR:

Sobre la base de Vlad y mis pruebas jsperf ... si el rendimiento es una preocupación (especialmente IE) ... clases siguen siendo el camino a seguir

+0

Estoy probando las clases también, agregando algunos querySelectorAll a mi caso de prueba. –

+2

http://jsperf.com/testing-data-atribute-selectors sí, parece que querySelectorAll es más lento en atributos de datos. ¡Esto es impactante! Esperaba que fueran más rápidos ya que no hay una secuencia de cadenas para obtener el valor real dentro de \ "\". –

+2

Wow .... prueba en IE9 ... selector de una sola clase _blows away_ el selector de datos ... y es incluso más rápido que Chrome para esa prueba .. IE 6300 ops/seg frente a Chrome's 4800 ... – BLSully

4

Tengo la impresión de que el rendimiento de los selectores es lo suficientemente rápido en este momento, incluso en los navegadores móviles. A menos que realmente planee usar selectores mucho, atributos de datos o basados ​​en clases, (en cuyo caso, sugeriría revisar su código para intentar almacenar en caché los selectores ya consultados) podemos considerarlos no tan malos. E incluso diría que no es dramático utilizar el estilo sobre los demás.

Creo que los proveedores de navegadores han pasado más tiempo mejorando el escenario más utilizado (consulta en contra de clases) que consultando contra selectores. Esto está cambiando y no me sorprendería que comiencen a optimizar otros casos también.

9

Después de verificar la respuesta de BLSully y el test page que proporcionó, estas son las cifras reales para comparar.

jQuery rendimiento selector de clase vs jQuery atributo de datos de rendimiento de las operaciones de selección por segundo:

  • 31% más rápido en Chrome 27.0.1453
  • 140% más rápido en Firefox 15.0.1
  • 131% más rápido en Firefox 21,0
  • 1.267% más rápido en IE 9,0
  • 1.356% más rápido en IE 10,0
0

No sé sobre todas estas respuestas pero ejecuté mi propia prueba y el atributo es más rápido.

puede intentar usted mismo acaba de guardar el tiempo al principio, hacer la tarea y obtener la última vez y luego hacer los cálculos

\t \t var newDate = new Date().getTime(); 
 
\t \t $('.test-t').removeClass('act'); 
 
\t \t $('.t1r').addClass('act'); 
 
\t \t var currentDate = new Date().getTime(); 
 
\t \t var diff = currentDate-newDate; 
 
\t \t console.log(diff); 
 

 
\t \t var newDate = new Date().getTime(); 
 
\t \t $('.test-t2').attr('this-act',''); 
 
\t \t $('.t2r').attr('this-act','1'); 
 
\t \t var currentDate = new Date().getTime(); 
 
\t \t var diff = currentDate-newDate; 
 
\t \t console.log(diff);

+0

No estoy seguro de si una instancia de cada uno es suficiente para probar el caso. ¿Cuán diferentes son los tiempos para cada enfoque ya que no pude ejecutar su fragmento? – miltonb

+0

Quizás ahora, después de unos años después de que se haya formulado la pregunta y los navegadores hayan tenido tiempo de actualizar sus motores de búsqueda, las cosas sean más rápidas con los atributos de los datos. Lo bueno es señalar esto. Tal vez deberíamos actualizar la pregunta para que coincida con los estándares de hoy. –

Cuestiones relacionadas