शीर्षक के संदर्भ में यह है कि अनसोल्ड सरणी की तुलना में सॉर्ट किए गए सरणी को संसाधित करना अधिक तेज़ क्यों है?
यह एक शाखा भविष्यवाणी प्रभाव भी है? खबरदार: यहाँ छँटाई सरणी के लिए प्रसंस्करण धीमी है !!
निम्नलिखित कोड पर विचार करें:
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);
...
}
यह मेरी मशीन पर लगभग 720 के मूल्य को प्रिंट करता है।
अब अगर मैं संग्रह सॉर्ट कॉल को सक्रिय करता हूं, तो यह मूल्य 142 तक गिर जाता है। क्यों?
परिणाम हैं निर्णायक, अगर मैं पुनरावृत्तियों / समय की संख्या में वृद्धि वे नहीं बदलते।
जावा संस्करण 1.8.0_71 (ओरेकल वीएम, 64 बिट), विंडोज 10 के तहत चल रहा है, एक्लिप्स मंगल में जेनेट परीक्षण।
अपडेट करें
सन्निहित मेमोरी एक्सेस (यादृच्छिक क्रम में बनाम क्रमबद्ध रूप से एक्सेस की गई डबल ऑब्जेक्ट) से संबंधित प्रतीत होता है। प्रभाव मेरे लिए लगभग 10k और उससे कम की लंबाई लंबाई के लिए गायब हो जाता है।
परिणाम प्रदान करने के लिए assylias के लिए धन्यवाद :
/**
* 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
*/