【问题标题】:Are empty blocks run?空块是否运行?
【发布时间】:2013-07-10 15:09:43
【问题描述】:

这是相关的,b.c.我想测试循环结构。我通常做的是放在一个简单的语句中,比如

i++

在循环中。我做这个 b.c.我想知道智能解释器是否不会运行空块。例如。

for(var i = 0; i < 10; i++) {
}

可能根本不循环,因为循环中没有任何内容。

所以我通常会这样做:

for(var i = 0; i < 10; i++) {
    i++;
}

但这确实测试了i++ 语句以及循环结构,这是我不想要的。

【问题讨论】:

  • 聪明的口译员做聪明的事,所以答案是可能的。然而,今天的 JS 环境不仅仅是解释器。
  • 跳过这样的循环一点也不聪明,我怀疑任何解释器都会这样做。
  • @bfavaretto:可以对其进行优化,将i 设置为其最终值。但我想知道循环的意义是什么,除了使i 等于最终值。
  • 我们的 cmets 有什么愚蠢的?这有什么实际应用?是什么迫使您选择替代方案?为什么你会运行一个循环来增加一个值,而没有任何其他副作用?
  • @CrazyTrain 在这种情况下是的,只需将i 设置为最终值即可。但是你可以在 for 的头上做各种各样的事情,比如更改许多变量、调用函数等。我认为优化器确定跳过循环是否值得或不(可能比仅运行大多数循环更昂贵)。关于 OP 的评论,我认为他在谈论我...... :)

标签: javascript micro-optimization


【解决方案1】:

来看看这个。请注意尝试显示警报时的延迟:http://jsfiddle.net/xs724/

for(var ii = 0; ii < 1000000000; ii++){}
alert("DONE");

我在 chrome 中对此进行了测试。它很可能因浏览器而异。

JsPerf 链接:http://jsperf.com/js-optimizationlooping

【讨论】:

  • +1。把它放在一个jsperf中,这样我们就可以看看是不是所有的浏览器都没有做这个优化。
  • 延迟从何而来?是从 jsFiddle 加载页面吗?循环多少钱?
  • @CrazyTrain 延迟与上限成比例,因此将数字更改为 10,看看它的加载速度有多快。
  • 我注释掉了循环,看看延迟是否来自页面加载,并且几乎是立即的。
  • @GrailsGuy:我的观点是同一页面的不同负载可能会随时间变化。最好通过定时执行来排除这种可能性。并不是说那绝对完美,但更好。
【解决方案2】:

答案是:你永远不知道。现代 JavaScript 引擎中正在进行许多优化。一个例子是死代码消除,它会跳过不影响最终结果的代码。

在 IE9 中有一个关于这个特性的相当有趣的争论: http://digitizor.com/2010/11/17/internet-explorer-9-caught-cheating-in-sunspider-benchmark/

但是你为什么要一遍又一遍地运行一个空块呢?

如果您希望 JavaScript 解释器简单地等待,请尝试以下答案:
What is the JavaScript version of sleep()?
Sleep in Javascript - delay between actions

【讨论】:

  • +1“你永远不知道”是唯一真正的答案,除非有人愿意研究每次更新的来源。
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多