400x Tri Speedup par la Commutation d'un.localeCompare(b) à (a<b?-1:(a>b?1:0))

Par la commutation d'un javascript fonction de tri de

myArray.sort(function (a, b) {
  return a.name.localeCompare(b.name);
});

à

myArray.sort(function (a, b) {
  return (a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
});

J'ai été en mesure de réduire le temps de trier un ~1700 élément de tableau dans google Chrome à partir de 1993 millisecondes à 5 millisecondes. Près d'un 400x speedup. Malheureusement, c'est au détriment de l'correctement trier des chaînes en anglais.

Évidemment, je ne peux pas avoir mon INTERFACE de blocage pendant 2 secondes lorsque j'essaie de faire un tri. Est-ce que je peux faire pour éviter les, horriblement lent localeCompare mais encore de maintenir le soutien pour les chaînes localisées?

  • Envisager tourne un web worker faire le localeCompare de tri de manière asynchrone. Vous trouverez peut-être que le temps passé à la sérialisation et la désérialisation cette quantité de données, l'emportent sur les avantages de le faire de manière asynchrone, mais ça vaut le coup.
  • Que serais probablement le travail, mais 2 secondes est toujours très lent à afficher les résultats.
  • Vous pourriez envisager une approche différente - comme de garder la liste triée dès le début, donc vous ne devez jamais explicitement de tri. D'où viennent les données? Il y a quelques auto-tri des structures de données pour JavaScript déjà mis en place: stackoverflow.com/a/5309821/139010 ou stackoverflow.com/a/3809836/139010
  • Il s'agit de Facebook. Nous avons terminé le préchargement et de tri avant qu'ils le nécessaire pour y accéder.
  • web les travailleurs ne semble pas gérer les localeCompare de la même façon que le reste du code. Voir cette question
  • notez que localeCompare n'est pas sensible à la casse (ou peut-être que ça dépend des utilisateurs régionaux? sur mon pc pour en_US il n'est pas sensible à la casse). Remplacement de votre code est sensible à la casse, "Foo" vient avant "bar"

InformationsquelleAutor Brad Dwyer | 2013-02-03