启用JS评测时,JavaScript代码工作得更快?什么
JavaScript Code Works Faster when JS Profiling is on? What?
我的应用程序面临着一个非常奇怪的行为——如果我启动探查器(必须是JS探查器),代码的工作速度几乎是原来的两倍。
我用一个非常简单的代码复制了它,可以在这个小提琴上找到:https://jsfiddle.net/zagrwk44/
问题是,这只能在带有旧显卡的机器上复制。我已经设法在带有AMD Radeon HD 6450图形卡的机器上复制了它。在更新的机器上,这种情况不会再发生了。
探查器是如何使代码运行得更快的??几乎是的两倍快!
这里需要花费时间的代码只是更改屏幕上div的位置:
for (var i = 0; i < 1000000; i++) {
box.style.top = getRandomInt(0, 100) + '%';
box.style.left = getRandomInt(0, 100) + '%';
};
我使用console.profile
和console.profileEnd
通过javascript启动和停止探查器为了重现它,运行时必须打开DevTools
谢谢!
无法在我的机器上重新编程
但我很好奇,你是否将使用DevTools open的运行与使用profiler的运行进行比较?如果是这样的话,解释可能是DevTools禁用了内部通知,比如在分析活动时更新Elements面板
如果你将运行与DevTools关闭进行比较,那么它看起来真的很奇怪。
我遇到了同样的问题,我可以在任何机器上重现。
DevTools本身会减慢代码的执行速度,这只会影响修改DOM的JS代码。这个问题不会影响不涉及DOM的JS代码。
如果你在快速修改DOM的同时查看DevTools中的"元素"选项卡,每次修改HTML元素时,它都会闪烁并突出显示修改后的元素。我通过在包含大量元素的SVG图表上进行测试进一步证实了这一点。
Chrome探查器在打开时明确禁用了DOM修改可视化功能。换句话说,探查器的速度应该与关闭DevTools时的速度相同。
所以,很遗憾,我不得不关闭DevTools,继续使用我的大型SVG图表。
我发现了这种奇怪的行为,这种行为只发生在"Windows server 2008 R2 enterprise"操作系统上。
您的测试仪不是正确的指示,因为它使用随机函数测试性能,这可能会导致每个样本的结果不同,更重要的是,您没有从时间采样中排除console.profile()和conole.profileEnd()这意味着您从未获得真正的本地结果。
为了获得更好和现实的结果,代码应该是这样的:
var random = [80,90,15,5,70,50,60,25,36,45,62,58,76,23,93];
fbtn.addEventListener('click', function() {
//START PROFILE BEFOR TIME START
if (withProfiling.checked) {
console.profile();
}
console.time('click handler');
for (var i = 0, v =0; i < 1000000; i++, v++) {
box.style.top = random[v] + '%'; //USE SAME NUMBERS FOR ALL TESTS
box.style.left = random[v] + '%';//USE SAME NUMBERS FOR ALL TESTS
if(v >= 14){
v= 0;
}
};
console.timeEnd('click handler');
// STOP PROFILE AFTER TIME END
if (withProfiling.checked) {
console.profileEnd();
}
});
这里有一个测试仪,可以更深入地跟踪它:http://embed.plnkr.co/bdreL4UVFyyWtDoNTXRs/
我通过代码删除了启动概要文件,因为我发现手动启动概要文件可以更好地恢复这种奇怪的行为。
要恢复它,请从Chrome上的DevTools的配置文件中选择"收集Javascript CPU配置文件"。
希望它有用,
Menachem
- 我错过了什么让ScrollSpy工作
- Doppio:多线程是如何工作的,有什么限制吗
- 什么能抵消我的工作压力
- 让 jquery 为 ajax 添加的元素工作的最佳方法是什么?
- 在什么情况下,应该.deep.equal失败,但使用JSON.stringify进行比较工作正常
- 我的ajax加载栏出了什么问题?为什么它不能正常工作
- 在表单提交将DOM的一部分替换为分部之后,我应该将ajax成功绑定到什么来使我的javascript工作
- 有什么技巧可以让vw调整大小以在webkit浏览器上的:before伪类上工作吗
- Jquery自动完成不是't工作.我做错了什么
- Javascript .call() 用法.一个工作案例,一个不是.有什么区别
- 在fter.js插件工作之前,我错过了什么
- 什么是完美的工作流程来处理A,B和amp;其中A取决于B,B取决于C
- 角度控制器的作用是什么;t控制器'他的工作由指令来完成
- 我不确定我缺少什么才能使此应用程序在Websockets上在Google Cloud上正常工作
- 我的jQuery在JSFiddle中工作,但不能在我的网站上工作!我做错了什么
- 为什么这个jQuery选择器工作?它基于什么
- FileWriter在javascript中究竟是什么工作的
- 什么工作得更快“for(在obj中键入)”或“.forEach”
- 角度和$q:奇怪的是,什么都没有工作
- 无法让插座工作 - 我错过了什么愚蠢的东西