JavaScript 是不是有更快的反向字符串算法?

Posted

技术标签:

【中文标题】JavaScript 是不是有更快的反向字符串算法?【英文标题】:Is there a faster Reverse String Algorithm for JavaScript?JavaScript 是否有更快的反向字符串算法? 【发布时间】:2018-06-18 21:04:27 【问题描述】:

所以我正在寻找最快的反向字符串函数。

这是我的函数以及我在互联网上找到的所有函数及其性能测试:

https://jsperf.com/javascript-reversing-string-performance

看起来最快的(也是我认为最漂亮的)是这样的:

function reverseString(str) 
  return str.split().reverse().join("");

但也许有更有效、更快的方法来做到这一点?

【问题讨论】:

用 C 或 WebAssembly 编写绑定。 看起来是这样,但无论写作多么优雅,就我的经验而言,这是最慢的一个。 【参考方案1】:

这个似乎更快:

function reverseString(str) 
  let reversed = "";
  const l = str.length;
  for(let i = l-1; i >= 0; i--) 
    reversed = `$reversed$str[i]`;
  
  return reversed;

【讨论】:

【参考方案2】:

可能有数十种不同的方法可以做到这一点,不包括内置的 reverse 函数,因为 JavaScript 没有。 下面是我在 JavaScript 中解决字符串反转问题的三个最有趣的方法。

解决方案 1

function reverseString (str) 
  return str.split('').reverse().join('')


console.time("function test");
reverseString('Hello') // => 0.250ms
console.timeEnd("function test");

解决方案 2

function reverseString (str) 
  let reversed = '';
  for (const character of str) 
    reversed = character + reversed
  
  return reversed

console.time("function test");
reverseString('Hello') // => 0.166ms
console.timeEnd("function test");

解决方案 3

function reverseString (str) 
  return str.split('').reduce((reversed, character) => character + reversed, '')

console.time("function test");
reverseString('Hello') // => 0.133ms
console.timeEnd("function test");

在 ES6 中,您还有一个选择

function reverseString (str) 
  return [...str].reverse().join('')

【讨论】:

嗯,您的第三个解决方案看起来比第一个更快,谢谢! 别指望它!这些结果仅适用于 1 次测试和 1 个单词。而且你不知道他/她的代理人当时在做什么。说真的,我什至无法理解为什么这个答案被接受了,因为它甚至没有开始回答 OP 的问题,即理论上哪种方式更快,而不是经验上如此糟糕的测试。【参考方案3】:

基于davaakhuu-erdenekhuu 解决方案,我创建了一个基准测试,以便您测试哪个最适合您 https://jsbench.me/4bkfflcm2z

我已经在 Macbook pro 16 上的 Firefox 和 Chrome 上运行它 似乎第一个选项在Firefox 上最快,第三个选项在Chrome 上最快

希望对你有用

【讨论】:

我在其中添加了 Max/Norman 更简单的“向后循环和连接”方法,它比 Davaakhuu 回答中的任何方法都快得多【参考方案4】:
function reverseString(str) 
    let reversed = ""
    for (let i = str.length -1; i >= 0; i--)
        reversed = reversed + str[i]
    
    return reversed;

从输入字符串的末尾开始工作是最佳的,尤其是取决于您如何组合字符。请记住,当您通过在开头插入(或删除)元素来修改数组时,必须调整所有其他元素的索引。

【讨论】:

以上是关于JavaScript 是不是有更快的反向字符串算法?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的反向 while 循环如何知道何时停止?

哪个版本的“查找出现”功能更快?

JavaScript JavaScript:反向字符串[扩展本机]

Django中模板总结[模板语言,模板继承,CSRF攻击,反向解析]

为什么稀疏密集乘法比密集稀疏乘法更快?

javascript如何反向截取字符串?