背景:
So I need to https://stackoverflow.com/q/19992253/2958725对很多字符串进行排序。实际上是字符串数组,但这不是重点。不是的,我需要实现自己的排序器功能,如链接问题中详述。性能对我来说非常重要。 jFriend00 非常有帮助地建议我使用String.prototype.localeCompare
。我正在排序的数组长度超过 100K,因此性能非常重要。上MDN 文档用于.localeCompare https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare#Performance, under Performance
, 它说:
当比较大量字符串时,例如对大型数组进行排序时,最好创建一个 Intl.Collator 对象并使用其比较属性提供的功能。
使用它似乎非常简单,并且 jFriend 函数的实现如下所示,在功能上似乎是等效的:
data = (function(arrE2){
var nIC = new Intl.Collator,
cmp = nIC.compare.bind(nIC);
return arrE2.concat().sort(function(a, b) {
var comp, i;
for (i = 0; i < Math.min(a.length, b.length); i++) {
if ((comp = cmp(a[i], b[i])) !== 0) return comp;
}
return (a.length > b.length) - (a.length < b.length);
});
})(data);
(如果它与 jFriend 的解决方案有任何不同,请纠正我。)
然而,我不清楚这是否会产生任何明显优越的性能,如果是的话,又是如何产生的。 MDN 当然可以更好地解释,因为链接页面国际配页机 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator甚至没有提及“性能”。所以我只能依靠自己的设备..我是一个n00b,所以我的直觉相当毫无价值,但我认为提高性能的唯一方法是规范的替代方案是否需要将整个语言环境加载到每次比较都会重新分配内存,同时保留分配的内存来存储对象中的区域设置数据。
我的问题是:
- 两者的行为相同吗?
- 随着性能的提高,我的新版本是否更优越?如果是,是否显着?
我遇到了类似的问题并发现这个jsperf https://jsperf.com/sort-locale-strings/5真的很有用。
底线:是的,Intl.Collator
几乎是两倍快a.localeCompare(b)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)