JavaScript:为什么这个循环的优化使它变慢?

时间:2015-03-18 07:22:50

标签: javascript performance for-loop

以下函数在数组中递归搜索字符串:

function searchStrings(tree, callback) {
  for (var i = 0; i < tree.length; ++i) {
    if (_.isArray(tree[i]) || _.isObject(tree[i])) {
      searchStrings(tree[i], callback)
    } else {
      tree[i] = callback(tree[i])
    }
  }
}

数组看起来像这样:

[ 'markdown',
  [ 'header', { level: 1 }, 'Title' ],
  [ 'para', '\'Example\'' ],
  [ 'para', '“Just in vate--hr”' ],
  [ 'hr' ],
  [ 'para', 'this is another and this is another hr' ],
  [ 'para', [ 'em', 'thoer' ], ' thrr nest ', [ 'strong', 'ert' ] ],
  [ 'bulletlist',
    [ 'listitem', 'this is a test' ],
    [ 'listitem', 'another test' ] ] ]

我后来用它来替换字符串:

function replaceCharacters(tree, callback) {

  console.time('time')

  for (var i = 1; i < tree.length; ++i) {
    if (tree[i][0] === 'para') {
      searchStrings(tree[i], function(str) {
        if (str.match(/"/g)) {
          str = str
            .replace(/"(?=\b|')/g, '“')
            .replace(/"(?!\b|')/g, '”')
        }

        return str
      })
    }
  }

  console.timeEnd('time')

我添加了if (str.match(/"/g))部分,认为如果循环跳过没有"的字符串,代码将运行得更快,因为replace不必为所有字符串运行。但是我错了。 time使用if语句为1ms且没有if语句为0ms

  

alex @ alex-K43U:〜/ node / m2k $ ./m2k10.js test.txt time:1ms

     

alex @ alex-K43U:〜/ node / m2k $ ./m2k10.js test.txt time:0ms

这里发生了什么?这对if (tree[i][0] === 'para')也是如此吗?

1 个答案:

答案 0 :(得分:1)

因为你有字符串。

在您的情况下,字符串匹配ifs中的条件。这样,您可以进行“小”比较和替换。您的优化将改善无需替换的情况。

正确的测试是不需要进行任何更改的测试。 我还建议一个更“大”的案例。在你的情况下,差异告诉你什么,因为它可能有另一个原因(可能是一个进程刚开始并稍微降低浏览器优先级等)。