Ho fatto un piccolo test e ho scoperto che array.sort(function(a, b) { return a - b; });
è molto più veloce di array.sort();
in JavaScript.JavaScript, l'ordinamento con il secondo parametro è più veloce
I risultati sono stati piuttosto scioccanti, circa 1,7 volte più veloci in IE9, 1,6 volte in FF7 e 6,7 volte in Chrome.
Inoltre, implementando quicksort da solo in JS, ho scoperto che era ancora più veloce di entrambi i metodi sopra menzionati. (Due diverse implementazioni, una accetta una funzione di confronto come parametro, l'altra no. Entrambe erano più veloci.)
Esiste qualche spiegazione ragionevole?
EDIT: I miei implementazioni:
No di confronto:
function quickSort(array, from, to) {
if(typeof from === 'undefined') {
from = 0;
to = array.length - 1;
}
else if(typeof to === 'undefined') {
to = array.length - 1;
}
if(to - from < 1) {
return;
}
var i = from, pivot = to, t;
while(i < pivot) {
if(array[i] > array[pivot]) {
t = array[i];
array[i] = array[pivot - 1];
array[pivot - 1] = array[pivot];
array[pivot] = t;
pivot--;
}
else {
i++;
}
}
quickSort(array, from, pivot - 1);
quickSort(array, pivot + 1, to);
}
Con di confronto:
function quickSortFunc(array, sortfunc, from, to) {
if(typeof from === 'undefined') {
from = 0;
to = array.length - 1;
}
else if(typeof to === 'undefined') {
to = array.length - 1;
}
if(to - from < 1) {
return;
}
var i = from, pivot = to, t;
while(i < pivot) {
if(sortfunc(array[i], array[pivot]) > 0) {
t = array[i];
array[i] = array[pivot - 1];
array[pivot - 1] = array[pivot];
array[pivot] = t;
pivot--;
}
else {
i++;
}
}
quickSortFunc(array, sortfunc, from, pivot - 1);
quickSortFunc(array, sortfunc, pivot + 1, to);
}
è una possibilità che la funzione di ordinamento viene eseguito da medie. Quanto erano grandi gli array che hai usato? – Matt
L'ordinamento "Normale" funziona sulla rappresentazione di stringa degli elementi. Potrebbe essere un possibile sovraccarico. –
Matt, l'ho testato su array di 100, 1000, 10000 e 100000 elementi. Felix, pensavo a proposito di questo, non spiega ancora perché la mia implementazione con un comparatore sia stata più veloce dell'implementazione nativa con un comparatore. –