为什么String.prototype.indexOf()比for循环更高效?

时间:2018-03-27 20:57:55

标签: javascript performance

我的印象是indexOf基本上是幕后的for循环。但是,请考虑以下事项:



const str = 'abcdefjhijklmnopqrstuvwxy'.repeat(10000) + 'z';
let before, after;

before = Date.now();
str.indexOf('z');
after = Date.now();

console.log('Time for indexOf', after - before);

before = Date.now();
for (let i = 0; i < str.length; i++) {
  if (str[i] === 'z') {
    break;
  }
}
after = Date.now();

console.log('Time for for loop', after - before);
&#13;
&#13;
&#13;

当字符串足够长时,为什么indexOf会更快?

1 个答案:

答案 0 :(得分:1)

您可以使用for循环进行一些进一步的优化:首先,不要在每次迭代时重新计算字符串的长度。其次,请勿重新分配(=) - 您希望比较(与===)。第三,在查看非常小的时间尺度时,请使用performance.now()代替Date.now()

const str = 'abcdefjhijklmnopqrstuvwxy'.repeat(1000000) + 'z';
let before, after;

before = performance.now();
str.indexOf('z');
after = performance.now();

console.log('Time for indexOf', after - before);

const strArray = [...str];
const strLength = strArray.length;
before = performance.now();
for (let i = 0; i < strLength; i++) {
  if (strArray[i] === 'z') {
    break;
  }
}
after = performance.now();

console.log('Time for for loop', after - before);

但是for循环仍然有不必要的包袱 - 字符串上的indexOf可以在比for循环中的代码更低的级别上运行 - 正好迭代字符串中的字符它的目的是什么 - 所以indexOf跑得更快。