Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么更快?运行空函数或检查函数是否未定义?_Javascript_Performance_Function_Optimization_Undefined - Fatal编程技术网

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

Javascript 什么更快?运行空函数或检查函数是否未定义?,javascript,performance,function,optimization,undefined,Javascript,Performance,Function,Optimization,Undefined,我正在编写一些代码,其中作为参数传入的函数有时可能未定义。出于对这种糟糕的“实践”的好奇,我想知道什么是真正更快的?给出一个空函数,或者让函数检查参数是否未定义 我做了下面的测试来尝试。答案非常令人惊讶 var timesTest = 1000; function empty(){} console.time('running an empty function'); for( var i=0; i<timesTest; i++ ){ empty(); } console.timeE

我正在编写一些代码,其中作为参数传入的函数有时可能未定义。出于对这种糟糕的“实践”的好奇,我想知道什么是真正更快的?给出一个空函数,或者让函数检查参数是否未定义

我做了下面的测试来尝试。答案非常令人惊讶

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

随着测试数量的增加,运行空白函数的速度会稍微快一点

我还没有试着在图表上画出来,但我对这种行为很好奇。有人知道这是为什么吗?这对现实世界的代码有什么影响

  • 获取更精确的基准测试和精美的图表。我做了一个:

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


  • “什么是真正更快的”——两者都不是。更好地选择可维护的功能。为了让您的测试能够衡量一些有意义的东西,您应该尝试运行现有的和不存在的功能。随机选择一个虽然这绝对是正确的答案,但我必须承认我对为什么有点好奇。我能想到的一件事是,当编译器检测到大循环时,函数是否正在内联(即函数调用被替换为零),而每次都需要进行变量测试,但这只是一个空假设。我怀疑,它对运行在什么上也非常敏感(例如,作为一个合适的优化编译器,V8的处理方式应该与诸如IonMonkey之类的JIT稍有不同。我期待jsPerf在收集更多数据后的结果。)我认为添加第4种情况更为正确:与调用空函数相比,这将是最糟糕的情况。谢谢您提供了指向jsperf的链接和建议。我认为你没有抓住重点,你完全正确这是一个微观优化,这个问题可能听起来像是我在问要用哪一个,而不是我在问的。我只是想满足我的好奇心,我当然希望在这里可以。
    // var timesTest = 100000;
    // results:
    // running an empty function: 1.125ms
    // checking if a function exists: 1.276ms 
    
    // results:
    // var timesTest = 1000000000;
    // running an empty function: 2096.941ms
    // checking if a function exists: 2452.922ms