2011-07-22 7 views
23

En CSS podemos utilizar varios métodos diferentes para definir un color:¿Diferencias de rendimiento entre las declaraciones de color?

  • color palabra: red
  • hexadecimales: #FF0000
  • Rojo// canales Azul Verde: rgb(255, 0, 0)
  • Tono/saturación/luminosidad : hsl(0, 100%, 50%)

Me doy cuenta de que el uso de colores con nombre no es un buena idea, ya que los diferentes navegadores tienen su propia idea de cómo es aquamarine.

Ignorando el canal alfa y el soporte del navegador, ¿hay alguna diferencia en cuanto a rendimiento entre estos 4 métodos?

Si estuviéramos tratando de exprimir hasta el último bit de optimización de nuestro CSS, ¿cuál sería el preferido, si hubiera? ¿Los valores de color se convierten a un formato específico internamente, o el rendimiento depende de cualquier otra cosa (como qué agente de representación o navegador se usa)?

Buscando una respuesta "técnica" si es posible, se agradecen las referencias.

+3

¿Realmente? No sabía que usar colores con nombre era una mala idea. Hubiera supuesto que la aguamarina equivalía a algún valor numérico en todos los navegadores en todos los sistemas operativos. ¿Mi suposición es incorrecta? – Marvo

+0

Relevante http://stackoverflow.com/questions/1171422/are-there-any-good-reads-for-using-hex-over-decimal-for-rgb-colour-values-in-cs – andyb

+0

@andyb: Gracias para el enlace. Esas respuestas son un poco flojas y no técnicas, algo así como orientadas en otra dirección, como "¿Qué es más fácil de escribir o entender?" –

Respuesta

15

Si suponemos que un navegador moderno hace un uso completo de la GPU, la representación del color interno será flotantes RGB. Haciendo caso omiso del nombre del color, que probablemente sea solo un mapa para hexagonal, creo que el hexágono y los canales serán los más rápidos. HSB será sin duda el más lento, ya que la conversión de HSB a RGB requiere algo de trabajo, unas 50 líneas de código C.

Sin embargo, creo que con el propósito de CSS, esta es una pregunta completamente irrelevante. Incluso para HSB a RGB, la cantidad de trabajo en un color será totalmente trivial. A modo de apoyo para esto, tengo varios programas, incluso los que se ejecutan en teléfonos móviles, que hacen la manipulación del color en un nivel por píxel en imágenes grandes donde estoy haciendo RGB-> HSB-> (alguna manipulación) -> RGB. Incluso realizar esta operación 100.000 veces en un ipad solo produce un retraso de un par de segundos, por lo que en esta plataforma relativamente lenta, creo que se puede suponer que la típica conversión de peor de los casos tarda menos de 0,0001 segundos. Y eso es ser pesimista.

Así que solo use lo que sea más fácil de codificar.

AGREGADO: para apoyar el no se preocupe por esta opción. Internamente, una GPU manipulará los colores como una matriz de flotantes, por lo tanto, en los términos C

color flotante [4];

o algo similar. Por lo tanto, la única conversión que se realiza para las opciones numéricas es una división simple entre 255.

Por otro lado, la conversión de HSB a RGB lleva mucho más tiempo - estimaría, de haber escrito el código para hacerlo, aproximadamente 10 a 20 operaciones. Entonces, en términos crudos, HSB es considerablemente más lento, PERO 20 (o incluso 20,000) operaciones en una GPU moderna no vale la pena preocuparse, es imperceptible.

+2

Pensé que alguien me diría que no me preocupara, intenté evitar ese tipo de comentarios. También tengo una curiosidad al respecto, por lo que no es totalmente irrelevante, y debe existir una respuesta precisa y concreta *, ¿no? Entonces, ¿estás diciendo que Hex se convierte a RGB, y que RGB es probablemente el más rápido? Y estoy de acuerdo con el nombre del color, creo que podemos suponer que no es el ganador :) Apreciamos que compartas tu experiencia. –

+0

@WesleyMurch, realmente no vale la pena preocuparse, creo que te estás perdiendo de cuán rápido son las CPU. Un Intel i7, por ejemplo, se ejecuta en ~ 150,000,000,000 de operaciones por segundo. Solo ve problemas importantes con este tipo de cosas si se está complicando al usar el código. Algunos elementos en un archivo CSS son irrelevantes, en varios órdenes de magnitud. – Cruachan

+1

Para que quede claro, entiendo completamente que la diferencia de rendimiento es * más allá de * trivial, realmente no tienes que convencerme, pero tengo una mente que siente curiosidad sobre cómo funcionan estas cosas y quería saber más al respecto. Realmente no encontré ninguna información en Google, supongo que es un tema de nicho. Una vez más, gracias por compartir tu conocimiento. –

1

Editar: Cada proceso tiene que bajar a un valor binario para r, g y b. Los bytes hexadecimal y rgb ya están configurados para eso, así que supongo que en realidad podrían tener más o menos la misma velocidad. El resto tiene que pasar por un proceso para llegar a un valor hexadecimal/RGB

#FF0000 = memory values of: 1111 1111 0000 0000 0000 0000 

rgb(255,0,0) = memory values of: 1111 1111 0000 0000 0000 0000 

Ambos casos son los más propensos almacenan en 3 variables int. Entonces, la verdadera pregunta es, ¿cuál es más rápido de procesar en valores binarios para estos enteros? HEX o DEC? Creo que HEX, pero no puedo respaldar eso. De todos modos, el código simplemente toma los valores binarios de estas variables.

+0

Cualquier referencia o explicación un poco más detallada sería genial si la tiene. Apenas entiendo cómo la conversión de hexadecimal a binario sería diferente de otro método, especialmente cuando se trata de renderizar un color, que podría decirse que está mejor representado en uno de los otros formatos. –

+0

@Wesley seguro, actualicé –

9

Por lo general, la optimización CSS se trata de minimizar el número de bytes que pasan por el cable. Los colores hexadecimales tienden a ser los más cortos (en su ejemplo, se podría usar # f00 en lugar de # ff0000).

Me doy cuenta de que esto no responde exactamente a la pregunta que me hizo, pero no he visto ninguna prueba de navegador que intente medir cómo las diferentes representaciones de color afectan la velocidad de reproducción.

7

Éstos son los resultados, incluyendo los nombres de colores, hexagonal, hexagonal corto, RGB, RGBA, HSL y HSLA. Puede ejecutar la prueba usted mismo here.

Performance Test Results

Cuestiones relacionadas