为什么这个循环倒退比前进慢得多?

时间:2012-06-06 21:55:40

标签: javascript performance loops

我在这里找到了另一个问题的答案How to count string occurrence in string? 所以我正在使用算法here,在对一些函数进行基准测试后,我想知道为什么向后循环比前进慢得多。

graph

Benchmark test here


  

注意:下面的代码不能正常工作,有   其他工作(这不是这个问题的重点),请注意   在复制之前>粘贴它

转发

function occurrences(string, substring) {

  var n = 0;
  var c = 0;
  var l = substring.length;

  for (var i = 0, len = string.length; i < len; i++) {

    if (string.charAt(i) == substring.charAt(c)) {
      c++;
    } else {
      c = 0;
    }

    if (c == l) {
      c = 0;
      n++;
    }
  }
  return n;
}

向后

function occurrences(string, substring) {

  var n = 0;
  var l = substring.length - 1;
  var c = l;

  for (i = string.length; i > 1; i--) {

    if (string.charAt(i) == substring.charAt(c)) {
      c--;
    } else {
      c = l;
    }

    if (c < 0) {
      c = l;
      n++;
    }
  }
  return n;
}

4 个答案:

答案 0 :(得分:4)

我认为向后测试有一个错误:

for (i = string.length; i > 1; i--) {

应该是

for (i = string.length - 1; i >= 0; i--) {

istring.length时,string.charAt(i)未定义。这样做几千次,它可以产生很大的差异。

Here's a modified test似乎更接近相同的表现。

答案 1 :(得分:2)

我自己找到了瓶颈。

当我这样做时

for (i = string.length; i > 1; i--) {

我意外地删除了var i中的“var”,因此我将i设为全局。 修好之后,我得到了预期的结果。

for (var i = string.length; i > 1; i--) {

我从不认为这可能是一个巨大的差异,所以要注意人。

Fixed Benckmark test here

之前:

Before

后:

After

PS:实际使用时,请勿使用此功能,indexOf版本要快得多。

答案 2 :(得分:0)

您正在测试哪些数据。如果您的数据有许多匹配的前缀,但反过来没有多少错误匹配,那可能会影响它。

对于像“aaabbaaa”这样的案件试图查找“aab”它会匹配aa然后失败,然后从第三个a继续并失败的那个搜索bug也不会。 ?

答案 3 :(得分:0)

因为它们不是完整的镜像函数,所以在两个函数的所有console.log()if内添加else并比较结果,您将看到测试不是公平。

你做错了什么。我建议在开始测试之前确保它们都按预期工作。