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:反向字符串[扩展本机]