当测试一个JavaScript项目的性能时,我注意到一个非常奇怪的行为 - JavaScript成员访问性能似乎深受它们所处范围的影响。我编写了一些性能测试,并且结果有差异多个数量级。好奇的JavaScript性能取决于变量范围
我在Windows 10的64位测试,使用这些浏览器:
- 谷歌浏览器,版本49.0.2623.75米 - 使用V8 JavaScript engine
- Mozilla Firefox浏览器,版本44.0.2 - 使用SpiderMonkey JavaScript engine
- 微软边缘,版本25.10586 - 使用Chakra JavaScript engine
这里是最相关的测试,我跑了各自的成果:
// Code running on global scope, accessing a variable on global scope
// Google Chrome: 63000 ms.
// Mozilla Firefox: 57000 ms.
// Microsoft Edge: 21000 ms.
var begin = performance.now();
var i;
for(i = 0; i < 100000000; i++) { }
var end = performance.now();
console.log(end - begin + " ms.");
// Code running on local scope, accessing a variable on global scope
// Google Chrome: 61500 ms.
// Mozilla Firefox: 47500 ms.
// Microsoft Edge: 22000 ms.
var begin = performance.now();
var i;
(function() {
for(i = 0; i < 100000000; i++) { }
})();
var end = performance.now();
console.log(end - begin + " ms.");
// Code running on local scope, accessing a variable on local scope
// Google Chrome: 50 ms.
// Mozilla Firefox: 28 ms.
// Microsoft Edge: 245 ms.
var begin = performance.now();
(function() {
var i;
for(i = 0; i < 100000000; i++) { }
})();
var end = performance.now();
console.log(end - begin + " ms.");
的代码之间在本地和全球范围运行差异误差范围内,虽然火狐似乎并获得在局部范围运行的相当一致的20%的性能提升。
最大的惊喜是访问本地范围的变量,它在Chrome和Firefox上的的速度是的1200到1600倍,在Edge上的速度是90倍。
为什么会出现这种情况,在三种不同的浏览器/ JavaScript引擎上?
'new Date()。getTime()'是一个非常糟糕的性能测量工具。使用Performance API来获得更准确的读数。 –
使用内置Date函数进行此测试没有任何问题。 – Freddie
@MadaraUchiha我更新了我的代码和测试结果以使用性能API,但没有明显的效果。感谢您的提示,但! –