काउंटरपिनिटिवली, हॉटस्पॉट 8 पर सबसे तेज़ संस्करण है:
MyClass[] arr = myList.toArray(new MyClass[0]);
मैंने jmh का उपयोग करके एक माइक्रो बेंचमार्क चलाया है जिसके परिणाम और कोड नीचे हैं, यह दिखाते हुए कि खाली सरणी वाला संस्करण लगातार एक निर्धारित सरणी के साथ संस्करण को बेहतर बनाता है। ध्यान दें कि यदि आप सही आकार के मौजूदा सरणी का पुन: उपयोग कर सकते हैं, तो परिणाम भिन्न हो सकते हैं।
बेंचमार्क परिणाम (माइक्रोसेकंड में स्कोर, छोटा = बेहतर):
Benchmark (n) Mode Samples Score Error Units
c.a.p.SO29378922.preSize 1 avgt 30 0.025 ▒ 0.001 us/op
c.a.p.SO29378922.preSize 100 avgt 30 0.155 ▒ 0.004 us/op
c.a.p.SO29378922.preSize 1000 avgt 30 1.512 ▒ 0.031 us/op
c.a.p.SO29378922.preSize 5000 avgt 30 6.884 ▒ 0.130 us/op
c.a.p.SO29378922.preSize 10000 avgt 30 13.147 ▒ 0.199 us/op
c.a.p.SO29378922.preSize 100000 avgt 30 159.977 ▒ 5.292 us/op
c.a.p.SO29378922.resize 1 avgt 30 0.019 ▒ 0.000 us/op
c.a.p.SO29378922.resize 100 avgt 30 0.133 ▒ 0.003 us/op
c.a.p.SO29378922.resize 1000 avgt 30 1.075 ▒ 0.022 us/op
c.a.p.SO29378922.resize 5000 avgt 30 5.318 ▒ 0.121 us/op
c.a.p.SO29378922.resize 10000 avgt 30 10.652 ▒ 0.227 us/op
c.a.p.SO29378922.resize 100000 avgt 30 139.692 ▒ 8.957 us/op
संदर्भ के लिए, कोड:
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
public class SO29378922 {
@Param({"1", "100", "1000", "5000", "10000", "100000"}) int n;
private final List<Integer> list = new ArrayList<>();
@Setup public void populateList() {
for (int i = 0; i < n; i++) list.add(0);
}
@Benchmark public Integer[] preSize() {
return list.toArray(new Integer[n]);
}
@Benchmark public Integer[] resize() {
return list.toArray(new Integer[0]);
}
}
आप इसी तरह के परिणाम, पूर्ण विश्लेषण, और ब्लॉग पोस्ट एरेस ऑफ़ विजंस ऑफ़ एंसिएंट्स में चर्चा पा सकते हैं । संक्षेप में: जेवीएम और जेआईटी संकलक में कई अनुकूलन शामिल हैं जो इसे सस्ते में नए आकार के सरणी बनाने और शुरू करने में सक्षम बनाते हैं, और यदि आप स्वयं सरणी बनाते हैं तो उन अनुकूलन का उपयोग नहीं किया जा सकता है।