什么更快?运行空函数或检查函数是否未定义?

Flu*_*lux 9 javascript optimization performance function undefined

我正在编写一些代码,其中作为参数传入的函数有时可能未定义.我很好奇这是一个糟糕的"练习",我想知道什么实际上更快?给一个空函数,或者让函数检查参数是否未定义?

我做了以下测试试试.答案非常令人惊讶!

var timesTest = 1000;

function empty(){}
console.time('running an empty function');
for( var i=0; i<timesTest; i++ ){
  empty();
}
console.timeEnd('running an empty function');

var somethingthatdoesnotexist;
console.time('checking if a function exists');
for( var i=0; i<timesTest; i++ ){
  if( somethingthatdoesnotexist ){
    somethingthatdoesnotexist();
  }
}
console.timeEnd('checking if a function exists');

// results:
// running an empty function: 0.103ms
// checking if a function exists: 0.036ms
Run Code Online (Sandbox Code Playgroud)

在较低的数字,检查未定义的参数要快得多.

一旦测试时间增加,事情就会变得有趣.

// var timesTest = 100000;
// results:
// running an empty function: 1.125ms
// checking if a function exists: 1.276ms 
Run Code Online (Sandbox Code Playgroud)

// results:
// var timesTest = 1000000000;
// running an empty function: 2096.941ms
// checking if a function exists: 2452.922ms 
Run Code Online (Sandbox Code Playgroud)

随着测试数量的增加,运行空白函数变得更快一点.

我还没有尝试在图表上绘制这个,但我很好奇这个行为.有人知道为什么吗?这对现实代码中的事情有何影响?

Doo*_*nob 15

  1. http://jsperf.com获得更准确的基准测试和花式图表.我做了一个:http://jsperf.com/empty-vs-check

  2. 这是微优化.没有人会注意到差异.十亿次迭代的差异不到半秒,这种情况永远不会发生.做你认为更可读的事情; 不要担心性能.

  • 虽然这对于该怎么做肯定是正确的答案,但我必须承认对于为什么这边会有点好奇.我能想到的一件事是,如果函数被内联(即函数调用被替换为无),因为编译器检测到大循环,而变量测试需要每次都进行,但它只是一个空假设.我怀疑,它对运行的内容非常敏感(例如,V8是一个正确的优化编译器,应该处理与像IonIon这样的JIT有点不同的东西.例如,一旦收集到更多数据,我期待jsPerf结果. ) (2认同)