Il titolo è in riferimento a Why is it faster to process a sorted array than an unsorted array?Perché l'elaborazione di un array ordinato * più lento * rispetto a un array non ordinato? (Java's ArrayList.indexOf)
È anche questo un effetto di previsione ramo? Attenzione: qui l'elaborazione per l'array ordinato è più lenta !!
Si consideri il seguente codice:
private static final int LIST_LENGTH = 1000 * 1000;
private static final long SLOW_ITERATION_MILLIS = 1000L * 10L;
@Test
public void testBinarySearch() {
Random r = new Random(0);
List<Double> list = new ArrayList<>(LIST_LENGTH);
for (int i = 0; i < LIST_LENGTH; i++) {
list.add(r.nextDouble());
}
//Collections.sort(list);
// remove possible artifacts due to the sorting call
// and rebuild the list from scratch:
list = new ArrayList<>(list);
int nIterations = 0;
long startTime = System.currentTimeMillis();
do {
int index = r.nextInt(LIST_LENGTH);
assertEquals(index, list.indexOf(list.get(index)));
nIterations++;
} while (System.currentTimeMillis() < startTime + SLOW_ITERATION_MILLIS);
long duration = System.currentTimeMillis() - startTime;
double slowFindsPerSec = (double) nIterations/duration * 1000;
System.out.println(slowFindsPerSec);
...
}
Questo stampa un valore di circa 720 sulla mia macchina.
Ora se si attiva la chiamata di ordinamento delle raccolte, tale valore scende a 142. Perché?!?
I risultati sono conclusivi, non cambiano se aumento il numero di iterazioni/ora.
La versione Java è 1.8.0_71 (Oracle VM, 64 bit), in esecuzione in Windows 10, JUnit test in Eclipse Mars.
UPDATE
sembra essere correlato all'accesso memoria contigua (oggetti doppie accede in ordine sequenziale vs in ordine casuale). L'effetto inizia a scomparire per me per lunghezze di array di circa 10k e inferiori.
Grazie a assylias per fornire the results:
/**
* Benchmark Mode Cnt Score Error Units
* SO35018999.shuffled avgt 10 8.895 ± 1.534 ms/op
* SO35018999.sorted avgt 10 8.093 ± 3.093 ms/op
* SO35018999.sorted_contiguous avgt 10 1.665 ± 0.397 ms/op
* SO35018999.unsorted avgt 10 2.700 ± 0.302 ms/op
*/
Possibile duplicato di [Perché si sta elaborando un array ordinato più veloce di un array non ordinato?] (Http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an -unsorted-array) –
http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
@DoubleDouble yes, la previsione del ramo è agnostica del linguaggio –