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

JavaScript: Why did the optimization for this loop made it slower?

本文关键字:优化 为什么 循环 JavaScript      更新时间:2023-09-26

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

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不必为所有字符串运行。但我错了。具有if语句为1mstime,不具有if语句是0ms:

alex@alex-K43U:~/note/m2k$/m2k10.js test.txt时间:1ms

alex@alex-K43U:~/note/m2k$/m2k10.js test.txt时间:0ms

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

因为您有字符串。

在您的情况下,字符串与if中的条件匹配。通过这种方式,您可以进行"小"比较和替换。您的优化将改善不需要进行替换的情况。

一个正确的测试将是一个不需要做任何改变的测试。此外,我还建议使用一个"更大"的案例。在你的差异告诉你什么都没有,因为它可能有另一个原因(可能是一个进程刚刚启动,降低了浏览器的优先级,等等)