在字符串对象上调用.localeCompare和构建一个特制的Intl.Collat​​or对象之间的性能差异?

时间:2013-11-15 04:38:16

标签: javascript arrays performance sorting locale

背景

所以我need to排序很多字符串。实际上,字符串数组,但除此之外。不是我需要实现我自己的分拣机功能,详见链接问题。性能对我来说非常重要。 jFriend00非常有帮助地建议我使用String.prototype.localeCompare。我正在排序的数组长度为100K +元素,因此性能非常重要。在MDN doc for .localeComparePerformance下,它说:

  

在比较大量字符串时,例如在对大型数组进行排序时,最好创建一个Intl.Collat​​or对象并使用其compare属性提供的函数。

使用它看起来非常简单,并且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当然可以更好地解释,因为Intl.Collator的链接页面甚至没有提到“性能”。所以我只是留给我自己的设备..我是一个n00b,所以我的直觉是毫无价值的,但我能想到的唯一方法来增强性能是因为规范的替代方案需要将整个语言环境加载到对于每个单独的比较重复记忆,同时保留分配的内存以将对话框数据存储在对象中。

我的问题是:

  • 这两个行为是否相同?
  • 我的新版本是否优于性能,如果是,是否显着?

1 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,发现this jsperf非常有用。

底线:是的,Intl.Collator几乎是a.localeCompare(b)的两倍。