javascript 拆分和连接函数或替换函数

roqulrg3  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(86)

我很好奇在JavaScript中哪个函数更快,我找不到解决这个问题的方法。让我们取一个简单的字符串,用下划线替换所有空格。

let string = 'Hello World';
let newString = string.split(' ').join('_');
//newString: Hello_World

字符串
另一种解决方法是replace函数:

let string = 'Hello World';
let newString = string.replace(/ /g,"_");
//newString: Hello_World


两种方式(在我看来)都可以阅读。我想知道目前(2018年5月)哪种方式更快。我找到了一些答案,但这些答案已经过时了,我想知道它们是否提高了新浏览器的性能。

bis0qfac

bis0qfac1#

我运行了一个JSPerf来测试哪一个更快,正如我所想的,replace函数大约快了40-50%(我在Chrome 66上测试):
https://jsperf.com/replace-vs-split-join-seblor
另外,您还获得了内存增益,因为split创建了一个数组。
2021年编辑:
由于这个答案仍在阅读中,这里有一个片段,以便您可以在浏览器中测试性能:

function runBenchmark() {
  console.log('Starting...');
  const string = 'Hello World';
  const replaceRegex = / /g;
  new Benchmark.Suite()
    .add('split & join', () => {
      let newString = string.split(' ').join('_');
    })
    .add('replace regex', () => {
      let newString = string.replace(replaceRegex, "_");
    })
    .add('replaceAll', () => {
      let newString = string.replaceAll(" ", "_");
    })
    .add('replaceAll with regex', () => {
      let newString = string.replaceAll(replaceRegex, "_");
    })
    .on('cycle', (event) => {
      console.log(String(event.target));
    })
    .run({ async: true });
}

个字符
在Chrome 94上,正则表达式替换似乎比拆分和加入快两倍。

bt1cpqcv

bt1cpqcv2#

以我个人的经验:除非你写的是绝对高性能的JavaScript(比如10 k ops/ frame),否则这根本不重要。编写一个有意义的perftest也非常困难,因为编译器优化非常复杂,很难理解实际测量的是什么。
在另一篇文章中,有一个提示,循环将是最快的,但我怀疑它在实践中是否真的相关。
Which is more efficient .replace() or .split().map().join()
看看@Seblor的jsperf测试结果,你会发现,每秒可能有几十万次调用,所以性能不是问题。
拆分-连接:1,381,976 ±6.79%慢25%
最快更换1,856,450 ±7.22%
所以:就用你更喜欢的吧。

k5hmc34c

k5hmc34c3#

我在Google上看到这个答案相对较高,而其他答案在您的用例中是正确的,它们在其他用例中并不适用。
Regex的伸缩性不好,只是采用Seblor的示例基准测试,但用William Shakespeare的书奥塞洛替换字符串“hello world”(我不是在链接代码,字符串有5730行长,但欢迎您访问此链接,其中包含完整的文档:https://shakespeare.mit.edu/othello/full.html
基准测试结果是操作减少了40%:

split & join x 1,486 ops/sec ±0.55% (12 runs sampled)
replace regex x 916 ops/sec ±0.26% (63 runs sampled)
replaceAll x 906 ops/sec ±0.71% (9 runs sampled)
replaceAll with regex x 910 ops/sec ±0.72% (63 runs sampled)

字符串
更微妙的答案是,你需要验证这些点:

  • 你的字符串有多长?字符串越长,正则表达式的效率就越低
  • 你的正则表达式有多复杂?匹配简单的空格是可以的,但是它越复杂,正则表达式的开销就越大。

顺便说一句,这实际上是ReDOS攻击的基础,通过发送字符串来降低服务器的速度,这些字符串将占用一个制作不良的正则表达式。

相关问题