javascript - 在字符串对象上调用 .localeCompare 和构造一个专用的 Intl.Collat​​or 对象之间的性能差异?

标签 javascript arrays performance sorting locale

背景:

所以我need to对很多字符串进行排序。实际上是字符串数组,但这不是重点。不是的是我需要实现自己的排序器功能,如链接问题中所述。性能对我来说非常重要。 jFriend00 非常有帮助地建议我使用 String.prototype.localeCompare。我正在排序的数组有 100K+ 个元素,因此性能非常重要。关于MDN doc for .localeCompare ,在 Performance 下,它说:

When comparing large numbers of strings, such as in sorting large arrays, it is better to create an Intl.Collator object and use the function provided by its compare property.

使用它似乎很简单,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,所以我的直觉是相当毫无值(value)的,但我能想到的提高性能的唯一方法是规范的替代方案是否需要将整个语言环境加载到为每个单独的比较重新分配内存,同时保留分配的内存以将语言环境数据存储在对象中。

我的问题是:

  • 两者的行为是否相同?
  • 随着性能的发展,我的新版本是否更优越?如果是,是否显着?

最佳答案

我遇到了类似的问题并找到了 this jsperf真的很有用。

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

关于javascript - 在字符串对象上调用 .localeCompare 和构造一个专用的 Intl.Collat​​or 对象之间的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19993639/

相关文章:

MySQL InnoDB 比 MyISAM 慢得多

javascript - Angular 2 注入(inject)器层次结构和 NgModule

Javascript 不稳定的行为或我的错误代码,数组值在实际操作之前增加

Java 对两个整数数组进行排序

c++ - 从数组中删除对象

arrays - 循环范围与循环数组之间的性能差异

javascript - 向 Yii 菜单项添加确认

javascript - 如何使用 document.getElementByID 附加 <br>?

c++使用ptr作为数组基础

java - 为什么我不能从 AsyncTask 加载位图?