拆分和连接功能或替换功能
Posted
技术标签:
【中文标题】拆分和连接功能或替换功能【英文标题】:Split and join function or the replace function 【发布时间】:2018-10-31 23:54:03 【问题描述】:我很好奇 javascript 中哪个函数更快,但我找不到解决这个问题的方法。让我们取一个简单的字符串并将所有空格替换为下划线。
let string = 'Hello World';
let newString = string.split(' ').join('_');
//newString: Hello_World
解决这个问题的另一种方法是替换功能:
let string = 'Hello World';
let newString = string.replace(/ /g,"_");
//newString: Hello_World
两种方式(在我看来)都可以阅读。我想知道此时(2018 年 5 月)哪种方式更快。我找到了一些答案,但它们已经过时了,我想知道它们是否提高了新浏览器的性能。
【问题讨论】:
设置性能测试以找出自己。为了让这里的任何人回答,他们必须做同样的事情 我的问题也是。实时示例:jsben.ch/HNunY 并得到了这个奇怪的结果,在 Chrome 97 中replaceAll
更慢,使用大字符串时更慢!
【参考方案1】:
我运行了一个 JSPerf 来测试哪个更快,正如我所想,replace
函数快了大约 40-50%(我在 Chrome 66 上测试过):
https://jsperf.com/replace-vs-split-join-seblor
此外,您还获得了内存增益,因为split
创建了一个数组。
2021 年编辑:
由于仍在阅读此答案,因此这里有一个 sn-p,因此您可以在浏览器中测试性能:
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, "_");
)
.on('cycle', (event) =>
console.log(String(event.target));
)
.run( async: true );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/2.1.4/benchmark.min.js"></script>
<button onclick="runBenchmark()">Run Benchmark</button>
在 chrome 94 上,正则表达式替换的速度似乎是拆分和加入的两倍。
【讨论】:
【参考方案2】:根据我的个人经验:这根本不重要,除非您正在编写绝对高性能的 JavaScript(例如 10k 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% 最快的
所以:选择你更喜欢的。
【讨论】:
“这根本不重要”这是一种错误的思考方式。正确的句子是“在您的项目范围内无关紧要”。想象一下,如果那里的每个应用程序都采用您的方法来编写代码。所有这些“小”性能优化可能会导致总体 CPU 使用率更高。并且通过扩展更高的功率使用,如果这是你关心的事情。我并不是说你完全错了,我是说直接告诉某人(可能是编程新手)他们不应该关心这些事情是个坏主意。以上是关于拆分和连接功能或替换功能的主要内容,如果未能解决你的问题,请参考以下文章