我到处读到变量缓存和链接 jQuery 函数调用对性能有好处。
但是,我遇到了这个 jsperf 测试,它似乎展示了一些有趣的怪癖。
请参阅以下测试用例:
案例 1:没有缓存
$(".myClass").css("color", "red");
$(".myClass").css("opacity", 1);
$(".myClass").css("display", "block");
案例 2:链接
$(".myClass").css("color", "red").css("opacity", 1).css("display", "block");
案例 3:对象缓存
var $myDiv = $(".myDiv");
$myDiv.css("color", "red");
$myDiv.css("opacity", 1);
$myDiv.css("display", "block");
案例 4:对象缓存 + 链接
var $myDiv = $(".myClass");
$myDiv.css("color", "red").css("opacity", 1).css("display", "block");
案例5:普通的jQuery
$(".myClass").css({
color: "red",
opacity: 1,
display: "block"
});
这是我的电脑(Win7 FF18)上按测试用例排序的性能测试结果:
- 无缓存 - 7,284 ops/s - 慢 92%,最慢
- 链接 - 10,284 ops/s - 慢 89%
- 对象缓存 - 95,968 ops/s - 最快
- 对象缓存 + 链接 - 10,353 ops/s - 89% 慢
- 普通 jQuery - 10,172 ops/s - 慢 89%
(这些结果与使用其他浏览器进行的测量一致。)
如您所见,测试用例 1 是预期的最慢的。奇怪的是,测试用例 3 最快,而测试用例 2、4 和 5 也很慢。
最大的惊喜是测试用例 3 比测试用例 4 快得多。换句话说,链接 jQuery 调用大大降低了性能。
您是否在自己的浏览器上注意到了这一点?
也许这是 .css() 方法的一个好处,但就个人而言,我认为现代 Javascript 引擎已经进行了特殊的代码优化,以增强来自同一根对象的函数调用序列。
你怎么看?