拆分和连接功能或替换功能

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 使用率更高。并且通过扩展更高的功率使用,如果这是你关心的事情。我并不是说你完全错了,我是说直接告诉某人(可能是编程新手)他们不应该关心这些事情是个坏主意。

以上是关于拆分和连接功能或替换功能的主要内容,如果未能解决你的问题,请参考以下文章

证书替换之连接服务器证书替换

证书替换之连接服务器证书替换

UMC测试连接功能开发

SpringBoot--集成Druid连接池

Cerebral Cortex:基因和环境对大脑功能连接的影响

有效的沟通