HTML中颜色选择的效率。RGB vs hex vs 名称

23

浏览器解析颜色的速度是否有所差别?

例如,对于颜色红色,我可以使用以下css:

.red
{
    color:red;
    color:#ff0000;
    color:rgb(255,0,0);
}

这些都会产生相同的结果,文本颜色为红色,但就效率而言,哪种方法最好?

我意识到使用文本“red”的字符数最少,对于使文档大小最小化来说,这是最好选择,这应该决定选择吗?

我之所以问这个问题,是因为网站上的所有东西都有不同的颜色,因此如果有一点变化可能会增加几毫秒的时间,那么使用最佳方法可能是值得的。


1
你考虑过测试这个吗? - David Thomas
可能是https://dev59.com/fnM_5IYBdhLWcg3w6HzT的重复问题。 - Alfabravo
1
@JimmyBanks:看看Ron的回答。令我大为惊讶的是,在IE上至少有数十毫秒的差异(已确认他的结果)。 - Eric J.
1
@JimmyBanks 很好的问题。 - Suresh Karia
3个回答

25

使用 #rrggbb 颜色哈希在 CSS 中,可以让浏览器更快地渲染页面。

我创建了一个非常简单的网页,通过 CSS 在 body 元素上设置了背景和前景颜色,在页面底部用一点 JS 设置了超时时间以输出第一次渲染时间(不幸的是,我使用了 performance.timing.msFirstPaint 值,所以它仅适用于 IE,但您可以从中获得要点)。我渲染了页面十次并取平均值。然后我更改了 CSS 中的颜色名称("green" 和 "white"),将它们更改为十六进制值(#008000 和 #fff),并重复了测量。使用名称时,页面平均渲染时间为41.6ms;使用十六进制值: 14.5ms。考虑到测试页面非常简单,仅包含两个颜色,我认为这是一个相当显著的差异。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Color name test</title>
    <style>body{background-color:green;color:white;}</style>
</head>
<body>
    <h1 id="foo"></h1>
    <script>
        setTimeout(function ()
        {
            var start = performance.timing.domLoading;
            document.getElementById("foo").innerHtml = 
              performance.timing.msFirstPaint - start;
        }, 1000);
    </script>
</body>
</html>


6
直到我亲自测试后,我才完全相信这一点。在我的环境中,性能差距甚至更大。请注意,由于某种原因,时间没有被插入到DOM中。我添加了一个警报来显示时间。你知道其他浏览器中是否有类似的性能计数器吗?很难想象将“green”和“white”转换为表示RGB值的整数需要约25毫秒的时间,与转换#rrggbb编码相比。 - Eric J.
3
我非常怀疑使用这个结果来做决策。 每个案例进行10次测试是不足以得出具有统计学意义的结论的,而先执行一种方式,然后再执行另一种方式似乎很容易引入实验中的其他变量。也许在测试前10次时,Windows正在后台运行一个繁重的进程? 或者,这个性能指标的标准差为200毫秒,而平均值恰好是这样算出来的。我认为需要更多的信息才能考虑这个结论是否有效。 - John Stimac
代码出错(https://developer.mozilla.org/en-US/docs/Web/API/PerformanceTiming/MsFirstPaint),很可能在现代浏览器上得到的结果不同。谁是那位拥有现代方法来获得精确而有意义的测试结果的专家? - joshfindit

13

在任何非微不足道的网页上,您无法测量这三个选项之间的任何差异。

与下载、解析和渲染页面相比,下载和解析几个字节的成本非常小。

@Vinny提供的性能测量结果支持这一点。

我询问的唯一原因是网站上的所有内容都有不同的颜色

如果您可以优化CSS以避免在许多不同的地方指定颜色(在可能的情况下使用继承属性),那么这很可能会对整体性能产生更大的影响(较少的CSS需要下载和解析)。


9

red最容易解析,但需要查表才能获取实际值。

#ff0000次之,需要3个文本转整数的转换才能获得实际值。

rgb(255,0,0)最难解析,仍然需要3个文本转整数的转换才能获得实际值。

第二种方法可能总体上是最快的,因为red方法(很可能)需要一个哈希操作(另一种文本转整数的转换,只是我们通常不这样想),然后进行查找。此外,与#ff0000相比,red标记可以任意长。

我不会就微观优化方面或其智慧发表评论。


嗯,这就是我在寻找的信息,很有道理。 - JimmyBanks
2
分析并没有真正回答这个问题:速度是否有差异。 - Jukka K. Korpela
2
“#ff0000 […] requires 3 Text -> Int conversions”。 不,单个24位转换就足够了,并将您的数据放入常见的内部格式中。此外,十六进制转换比十进制转换更快,但这取决于微观优化的数量。 - Remco
除非你尝试成为一个好的浏览器并检查#fff符号。 - Noch_ein_Kamel
不要使用颜色名称。这可能更容易记住,也更容易输入,但对于浏览器的性能来说会更差。 - Saint48198

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接