为什么localeCompare比Collator.compare更快速?

3
我已经阅读了多篇文章和评论,说使用Intl.Collator在比较字符串时有性能上的好处。EcmaScript文档指出,localeCompare只是在底层使用Collator,但可能会在每个函数调用时创建新的Collator实例。
这对我来说是有道理的,但我已经测试了两种选项的性能,结果令人惊讶。我创建了一个包含50000个字符串的数组,其中每个字符串都是由15个小写英文字母组成的。然后我比较了array.sort((a, b) => a.localeCompare(b))array.sort(collator.compare)的速度,并创建了一个基准测试,你可以在这里自己看到: https://www.measurethat.net/Benchmarks/Show/27780/0/intlcollatorcompare-vs-localecompare 一致的结果是,在这种情况下,localeCompare的速度是它的两倍。你能帮我理解为什么吗?
注意:如果我将第二个参数(例如'pl')传递给localeCompare,它的性能会大大降低。

localeCompare 在 Firefox 中速度较慢,但在 Chrome 中确实快了 3 倍。Chrome 可能在这方面没有遵守 ECMAScript 规范。 - undefined
这里有使用Collator的CodePen链接:https://codepen.io/NiedziolkaMichal/pen/dywQaJd,还有localeCompare的链接:https://codepen.io/NiedziolkaMichal/pen/ExGOrQW。在我的观察中,Firefox上的速度看起来差不多,但在Chrome和Safari上,localeCompare明显更快。 - undefined
我也遇到了这个问题,在我的情况下只是比较长度为一的字符串。在Chrome中,CollatorlocaleCompare慢了多次,而在Firefox中,localeCompare稍微快一些。不过,在这两种情况下,使用===<进行两次比较比其他选项都要快。 - undefined
我有一种直觉,这可能是V8优化的一个效果,比如这个 - undefined
1个回答

1
在基于v8的浏览器(如Chrome)中,这可能是一个解释,即localeCompare对比ASCII字符的字符串有一个优化,它利用查找表在L1和L3上进行比较。我尝试对比包含非ASCII字符的字符串这里,并且localeCompareIntl.Collator的结果相似。

看起来是正确的。我已经创建了一个测试,其中包含字符“{”,“|”和“}”,它们的代码点分别是123、124和125,而localeCompare的速度明显更快。而包含代码点133、134和135的字符“…”,“†”和“‡”的比较测试并没有显示出localeCompare的性能优势。看来只要我们坚持只使用单个参数,使用localeCompare是有益的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接