JavaScript - 循环是否比逐行离散编写更快?

标签 javascript performance loops readability

忽略所有代码的整洁性和可读性,哪个脚本完成得更快?

这个:

for(var i = 0; i < 10; i++){
  --do that thing--
}

或者这个:

--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--
--do that thing--

或者它们在性能方面是否相同?

最佳答案

通过重复“复制和粘贴”循环体“展开”循环可以提高或降低性能。

结果取决于...

  • ...你的 JavaScript 引擎
  • ...循环体中的代码
  • ...您的代码的文档化程度如何(不是开玩笑!)

让我们使用 Google 流行的 V8 JavaScript 引擎(Chrome、Node)来分析性能:

普通循环:

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

展开的循环:

var count = 0;
count += 1;
count += 1;
... 
count += 1;

结果:展开的循环大约快 10 倍

但是如果我们循环 1000 次而不是 10 次呢?然后展开的循环突然变得比普通循环慢 10 倍!

如果我们用函数调用交换简单的算术表达式呢?

普通循环:

function f() {
  return 1;
}

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

展开的循环:

var count = 0;
count += f();
count += f();
... 
count += f();

结果:展开的循环大约快 50%

但是如果我们给函数 f 添加注释呢?

function f() {
  // bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
  return 1;
}

展开的循环突然慢了 20%!

这是为什么?

  • V8 在解析主体包含少于 600 个字符(包括空格和注释)的函数时自动内联代码。
  • V8 执行 on-stack-replacement当函数“卡住”在一个很长的循环中时。

关于最后一个例子:通过添加超过 600 个字符的长注释,我们防止 V8 在解析期间内联函数 f 并依赖于针对整个函数的运行时优化功能(例如“堆栈替换”)和循环但不是手动重复代码。

如您所见,很难预测这种微“优化”的结果。所以最好不要这样做 - 除非你针对特定 JS 引擎的特定版本。

参见 https://jsfiddle.net/Lj9v7c2m/用于性能分析 - 根据您的计算机/浏览器/版本,您可能会得到不同的结果。

关于JavaScript - 循环是否比逐行离散编写更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38111355/

相关文章:

vba - Excel 复制、粘贴、转置以下循环,直到

Jquery 带有延迟的排队动画序列;需要重复

javascript - 如何跳过N个节点?

javascript - 使用 ng-if 正在清除模型查看表单环绕

javascript - Nativescript 检测文本字段上的焦点变化 - 代码隐藏

ios - 执行优先级非常低的代码

c++ - 为什么预分配函数指针的性能比分支差?

java - 在没有字符串比较的情况下以数学方式查找数字子字符串

javascript - Yammer JSON SDK 在 Chrome 和 FF 中通过 ADFS 进行身份验证,但在 IE 中访问被拒绝

java - 使用不同名称声明多个对象