【问题标题】:What is faster? Running an empty function or checking if function is undefined? [closed]什么更快?运行一个空函数或检查函数是否未定义? [关闭]
【发布时间】:2014-01-07 10:04:08
【问题描述】:

我正在编写一些代码,其中作为参数传入的函数有时可能未定义。对此感到好奇,这是一种不好的“做法”,我想知道什么实际上更快?给出一个空函数,还是让函数检查参数是否未定义?

我做了以下测试来尝试。答案很意外!

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

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

一旦测试的次数增加,事情就会变得有趣。

// 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 

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

我还没有尝试将其绘制在图表上,但我很好奇这种行为。有人知道为什么吗?这对现实世界的代码有何影响?

【问题讨论】:

  • “实际上更快” --- 两者都不是。更喜欢可维护性更好的东西。
  • 为了让你的测试测量有意义的东西——你应该尝试运行现有的和不存在的函数。并随机挑选一个

标签: javascript performance function optimization undefined


【解决方案1】:
  1. http://jsperf.com 以获得更准确的基准测试和精美的图表。我做了一个:http://jsperf.com/empty-vs-check

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

【讨论】:

  • 虽然这绝对是关于做什么的正确答案,但我必须承认在为什么方面有点好奇。我能想到的一件事是,当编译器检测到大循环时,函数是否被内联(即函数调用被替换为空),而每次都需要进行变量测试,但这只是一个空洞的假设。我怀疑它对运行的内容也高度敏感(例如,V8 作为一个适当的优化编译器应该处理的事情与 JIT 有点不同,例如 IonMonkey。我期待 jsPerf 一旦收集到更多数据就会得到结果。 )
  • 我认为添加第 4 种情况会更正确:jsperf.com/empty-vs-check/2 与调用空函数相比,这将是最坏的情况
  • 感谢您提供指向 jsperf 的链接和建议。我认为你没有抓住重点,你是绝对正确的,这是一个微优化,这个问题听起来像是我在问使用哪个,而不是我在问。我只是想满足我的好奇心,我当然希望在这里没问题。
猜你喜欢
  • 2011-07-13
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2016-09-28
相关资源
最近更新 更多