【问题标题】:for loop versus if conditionfor 循环与 if 条件
【发布时间】:2012-08-18 19:53:59
【问题描述】:

执行一段代码有两种选择。该代码基本上重置了三个数组中的所有值。其中两个是 int 数组,一个是 boolean。

选择 1

for (i = 0; i < array1.length; i++)
    array1[i] = 0;

for (i = 0; i < array2.length; i++)
    array2[i] = 0;

for (i = 0; i < array3.length; i++)
    array3[i] = false;

选择 2

int limit = <assign the greatest of the array lengths>

for (i = 0; i < limit; i++)
{
    if (i < array1.length)
        array1[i] = 0;

    if (i < array2.length)
        array2[i] = 0;

    if (i < array3.length)
        array3[i] = false;
}

哪些会更快?鉴于数组可以有不同的长度并且彼此之间没有关系。

here 有一个很好的讨论。首先列出的答案很好地解释了数组在 javascript 中的实际含义。有兴趣的可以去看看!

【问题讨论】:

  • 我强烈怀疑差异会很大。不要把时间浪费在这样的 mikro 优化上。
  • 你应该测量它:)
  • @Niko:我正在努力学习如何最好地编程。因此,从一个像这样的小查询开始。迪特里希已经给了我很好的信息!
  • +1 用于测试我对抗万恶之源
  • 这里对数组初始化性能进行了彻底的讨论:stackoverflow.com/questions/1295584/…

标签: javascript optimization loops if-statement


【解决方案1】:

这个版本几乎肯定会更快。它也更容易阅读更短,这两个属性都比速度更重要(99% 以上的时间)。

for (i = 0; i < array1.length; i++)
    array1[i] = 0;

for (i = 0; i < array2.length; i++)
    array2[i] = 0;

for (i = 0; i < array3.length; i++)
    array3[i] = false;

一般来说,访问内存中接近您最近访问的数据的数据会更快。

此版本也不会受到您在第二个版本中获得的额外分支的影响。

足够先进的编译器会将第二个版本转换为第一个版本。

基准测试:如果不先分析整个程序,微基准测试 100% 无用。由于我认为性能测量没有用,因此我不提供它们。

【讨论】:

  • 我的 2c 是 更短 只是更容易阅读/理解的一个促成因素。如果考虑到所有因素,更长的替代方案更容易理解/更清晰,那么这可能就是要使用的替代方案。
  • 我的观点是,任何同时更短且更易于理解的代码显然都是好的,而长/简单代码和短/不透明代码之间存在争论的空间。
【解决方案2】:
function reset_array(array, value) {
  var len = array.length;
  array.length = 0;
  while (len--) array.push(value);
}

reset_array(array1, 0);
reset_array(array2, 0);
reset_array(array3, false);

【讨论】:

  • 不,这个版本没有使用for循环那么快,而代码更简洁,这是你的选择。
  • 但它会再次通过函数调用减慢执行速度:)
  • @Champ:你怎么知道它会减慢执行速度?也许函数会被内联,也许不会。也许具有该功能的版本可以获得更好的分支预测,也许不是。谁知道?
  • 可能是因为它包含循环,所以编译器可能不会将其视为内联函数
猜你喜欢
  • 2021-12-30
  • 2013-07-18
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多