1
var testvar = 'boat';

function testA() {

    console.log(testvar);

}

function testB() {

    console.log(window.testvar);

}

我知道如果我不放“窗口”。对于我的全局变量,然后 javascript 从方法 testA 开始搜索所有范围,直到找到变量 testvar,所以如果我执行 window.testvar 会使其更快,因为我直接告诉 javascript 在哪个范围中查找变量? 还是因为我首先告诉 javascript 查找窗口对象然后查找变量而变慢?

4

4 回答 4

2

分别尝试下面的两个代码并亲自查看结果。实际上,这可能不是最准确的测试用例,但是通过避免所有其他操作并在足够长的 for 循环内进行简单分配,它应该足够准确。

我不得不说,我也很惊讶地发现,通过不指定windowChrome,第二个代码的执行速度持续提高了 20%。

代码 1

// window.testvar testcase.
window.testvar = 'Hi there! I am a testvar!';
var tmp;
var start = new Date();
for(var i = 0; i < 1000000; i++){
    tmp = window.testvar;
}
var stop = new Date();
console.log('This took exactlly ' + (stop.getTime() - start.getTime()) + ' milliseconds!');

结果:

  • 1695毫秒
  • 1715毫秒
  • 1737毫秒
  • 1704毫秒
  • 1695毫秒

代码 2

// direct testvar testcase
testvar = 'Hi there! I am a testvar!';
var tmp;
var start = new Date();
for(var i = 0; i < 1000000; i++){
    tmp = testvar;
}
var stop = new Date();
console.log('This took exactlly ' + (stop.getTime() - start.getTime()) + ' milliseconds!');

结果:

  • 1415毫秒
  • 1450毫秒
  • 1422毫秒
  • 1428毫秒
  • 1450毫秒

在 Chrome 20.0.1132.47 中测试。

于 2012-07-01T16:21:51.600 回答
1

Vedaant 的 jsperf 没有帮助。它只是创建函数,而不是执行它们。试试这个:http: //jsperf.com/epictest/9。它也表明不指定窗口更快。我还添加了一个测试来表明复制到局部变量的速度要快得多。改变循环计数器,看看你赢得的不仅仅是对全局的单一引用。

于 2012-08-22T19:28:58.137 回答
0

Chrome 有一个有用的 javascript CPU 分析器。只需创建一个循环来运行该函数数千次并启动分析器。我猜差异很小,但这是确定的好方法。

于 2012-07-01T16:08:05.673 回答
0

我刚刚为您做了一个 jsPerf 测试,请访问:http: //jsperf.com/epictest。看起来

function testA() {

   console.log(testvar);

}

有点快。

于 2012-07-01T16:16:36.443 回答