我很好奇在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月)哪种方式更快。我找到了一些答案,但这些答案已经过时了,我想知道它们是否提高了新浏览器的性能。
3条答案
按热度按时间bis0qfac1#
我运行了一个JSPerf来测试哪一个更快,正如我所想的,
replace
函数大约快了40-50%(我在Chrome 66上测试):https://jsperf.com/replace-vs-split-join-seblor
另外,您还获得了内存增益,因为
split
创建了一个数组。2021年编辑:
由于这个答案仍在阅读中,这里有一个片段,以便您可以在浏览器中测试性能:
个字符
在Chrome 94上,正则表达式替换似乎比拆分和加入快两倍。
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%
所以:就用你更喜欢的吧。
k5hmc34c3#
我在Google上看到这个答案相对较高,而其他答案在您的用例中是正确的,它们在其他用例中并不适用。
Regex的伸缩性不好,只是采用Seblor的示例基准测试,但用William Shakespeare的书奥塞洛替换字符串“hello world”(我不是在链接代码,字符串有5730行长,但欢迎您访问此链接,其中包含完整的文档:https://shakespeare.mit.edu/othello/full.html)
基准测试结果是操作减少了40%:
字符串
更微妙的答案是,你需要验证这些点:
顺便说一句,这实际上是ReDOS攻击的基础,通过发送字符串来降低服务器的速度,这些字符串将占用一个制作不良的正则表达式。