शीर्षक Why is it faster to process a sorted array than an unsorted array?एक अनुक्रमित सरणी की तुलना में एक क्रमबद्ध सरणी * धीमी * प्रसंस्करण क्यों कर रहा है? (जावा का ArrayList.indexOf)
क्या यह एक शाखा पूर्वानुमान प्रभाव भी है? सावधान रहें: यहां सॉर्ट किए गए सरणी के लिए प्रसंस्करण धीमी है !!
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 और उससे कम की सरणी लंबाई के लिए प्रभाव मेरे लिए गायब हो जाता है। the results प्रदान करने के लिए 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
*/
संभावित डुप्लिकेट [एक अनुक्रमित सरणी की तुलना में एक क्रमबद्ध सरणी को तेजी से संसाधित क्यों कर रहा है?] (Http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an -unsॉर्टेड-सरणी) –
http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
@ डबल डबल हां, शाखा भविष्यवाणी भाषा अज्ञेय –