javascript-JSPerf测试结果随着测试运行而变慢?
作者:互联网
背景:因此,我正在尝试进行测试,以查看使用jQuery的on.()绑定“ click”事件的三种方法的性能差异.我看到了一些很大的差异(比我预期的要大得多),当同事运行结果时,他注意到,如果您切换测试运行的顺序,结果将发生变化,但同样“不合时宜”.
因此,我决定进行一个非常简单的测试:
1)一位父母< div>包含100个子< div> ;,每个子&div s都只是一个简单的内部数字(1-100)和类值“ target-element”. 2)每个元素都有一个单击事件绑定到它,使用此方法:
$(".target-element", "#context1").on("click", logClick);
3)click事件只是将文本值设置为局部变量:
function logClick() {
var sTextVal = $(this).text();
}
4)然后,我设置了一个“触发”函数来调用所有子< div&s s上的点击:
function triggerClicks(context) {
$(context).find(".target-element").each(function() {
$(this).click();
});
});
5)然后,我设置了3个测试运行,都称为EXACT相同的测试:
运行1 —> triggerClicks(“#context1”);
运行2 —> triggerClicks(“#context1”);
运行3 —> triggerClicks(“#context1”);
您可以在此处查看测试:http://jsperf.com/jsperf-perf-test
在我测试过的所有浏览器中,结果都大不相同,随着运行的继续,速度越来越慢:
镀铬41
Run 1 ---> 59.91 Ops/sec (±6.55%) - fastest
Run 2 ---> 32.72 Ops/sec (±5.06%) - 45% slower
Run 3 ---> 23.69 Ops/sec (±3.39%) - 59% slower
Firefox 36
Run 1 ---> 52.69 Ops/sec (±10.21%) - fastest
Run 2 ---> 26.70 Ops/sec (±6.38%) - 48% slower
Run 3 ---> 15.95 Ops/sec (±24.55%) - 73% slower
IE 9
Run 1 ---> 26.98 Ops/sec (±14.43%) - fastest
Run 2 ---> 11.77 Ops/sec (±8.89%) - 54% slower
Run 3 ---> 7.54 Ops/sec (±6.85%) - 70% slower
那我在这里想念什么?我意识到这是一个重复的测试,并且要处理很多元素,但这不应严重影响运行结果.有人能看到我的代码导致这种情况发生的任何原因,而不是JSPerf的严重错误吗?
解决方法:
如果您查看表单中“准备代码”字段旁边的帮助文本:
runs before each clocked test loop, outside of the timed code region
这意味着代码在每个测试用例之前运行,而不仅仅是一次.因此,在第二个测试用例中,每个元素将有两个事件处理程序,而在第三个测试用例中将有三个.
这就是在准备字段正下方有一个“拆卸”字段的原因:应该使用它来撤消您在设置中所做的操作,以避免出现这种情况.如果将此添加到拆解中:
$(".target-element", "#context1").off("click");
那么在添加新事件处理程序之前,将删除现有事件处理程序,并且测试需要大约相同的时间来运行.
标签:jsperf,javascript,jquery 来源: https://codeday.me/bug/20191120/2045245.html