सूची 10 लाख तत्वों के साथ रैंडमम्स की सूची लगभग 700 एमबी मेमोरी स्पेस की आवश्यकता है।
-XX:+PrintGC
-XX:+PrintGCTimeStamps
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-Xmx1000m
-Xms1000m
-Xmn999m
-XX:SurvivorRatio=65535
काफी बड़ी सभी तत्वों को बचाने के लिए और कोई जीसी बनाने के लिए युवा पीढ़ी बनाने: आदेश जीसी के प्रभाव से बचने के लिए (यकीन है कि के लिए, यह इस परीक्षण में बहुत मायने रखता है), मैं इस तरह हॉटस्पॉट वीएम तर्क सेट तत्व आवंटन के दौरान। मैं युवा पीढ़ी के भीतर तत्वों की प्रतिलिपि से बचने के लिए यंग जनरेशन के ईडन क्षेत्र को बड़ा बनाता हूं।
परिणाम आश्चर्यजनक है!। कुल निष्पादन समय 8 से 0.6 के बीच घटता है!
यहां, मैंने प्रश्नकर्ता के लिए कुछ अतिरिक्त काम किया है, यह जांच कर रहा है कि क्या ऐरेलिस्ट का पूर्व आवंटन समय बचा सकता है और इससे कितना मदद मिलती है।
long startTime;
List<String> randNums;
Random r = new Random(1);
System.out.println("-----------------------------ArrayList With Enough Capacity Allocated:----------");
for(int loop=0;loop<5;loop++) {
startTime = System.currentTimeMillis();
randNums = new ArrayList<String>(SIZE);
for (int i = 0; i <SIZE ; i++) {
int randomNum = r.nextInt();
randNums.add(Integer.toString(randomNum));
}
System.out.println(System.currentTimeMillis() - startTime); //print time of this loop
randNums.clear();
System.gc();
}
System.out.println("\n-----------------------------ArrayList Auto-Capacity:----------");
for(int loop=0;loop<5;loop++) {
startTime = System.currentTimeMillis();
randNums = new ArrayList<String>();
for (int i = 0; i <SIZE ; i++) {
int randomNum = r.nextInt();
randNums.add(Integer.toString(randomNum));
}
System.out.println(System.currentTimeMillis() - startTime); //print time of this loop
randNums.clear();
System.gc();
}
उत्पादन होता है:
यहाँ मेरी कोड है
-----------------------------ArrayList With Enough Capacity Allocated:----------
625
0.712: [Full GC (System.gc()) 714143K->39628K(1023936K), 0.1450449 secs]
0.863: [GC (CMS Initial Mark) 98268K(1023936K), 0.0549729 secs]
545
1.413: [Full GC (System.gc()) 705185K->564K(1023936K), 0.1239084 secs]
483
2.031: [Full GC (System.gc()) 679570K->564K(1023936K), 0.1256323 secs]
2.160: [GC (CMS Initial Mark) 59357K(1023936K), 0.0274108 secs]
523
2.688: [Full GC (System.gc()) 670987K->564K(1023936K), 0.1222910 secs]
482
3.302: [Full GC (System.gc()) 673223K->564K(1023936K), 0.1299938 secs]
-----------------------------ArrayList Auto-Capacity:----------
3.432: [GC (CMS Initial Mark) 40961K(1023936K), 0.0003740 secs]
3.907: [GC (CMS Final Remark) 698381K(1023936K), 0.1091347 secs]
796
4.240: [Full GC (System.gc()) 911984K->56183K(1023936K), 0.1719540 secs]
4.412: [GC (CMS Initial Mark) 56183K(1023936K), 0.0394210 secs]
4.770: [GC (CMS Final Remark) 528894K(1023936K), 0.0726012 secs]
690
5.111: [Full GC (System.gc()) 893818K->2060K(1023936K), 0.1364215 secs]
5.248: [GC (CMS Initial Mark) 20769K(1023936K), 0.0008902 secs]
5.750: [GC (CMS Final Remark) 694113K(1023936K), 0.1124856 secs]
704
5.962: [Full GC (System.gc()) 808646K->2081K(1023936K), 0.1338328 secs]
6.096: [GC (CMS Initial Mark) 21137K(1023936K), 0.0010118 secs]
6.599: [GC (CMS Final Remark) 688155K(1023936K), 0.0899929 secs]
661
6.767: [Full GC (System.gc()) 810872K->2081K(1023936K), 0.1287272 secs]
6.896: [GC (CMS Initial Mark) 21512K(1023936K), 0.0010619 secs]
7.398: [GC (CMS Final Remark) 691216K(1023936K), 0.1083076 secs]
681
7.586: [Full GC (System.gc()) 803590K->2081K(1023936K), 0.1269813 secs]
7.714: [GC (CMS Initial Mark) 2081K(1023936K), 0.0008965 secs]
स्ट्राइपिंग जीसी जानकारी है, यह है:
-----------------------------ArrayList With Enough Capacity Allocated:----------
615
540
480
511
480
-----------------------------ArrayList Auto-Capacity:----------
680
708
640
644
663
हम का उपयोग करता है प्रत्येक समूह के अंतिम तीन डेटा अनुकूलन की गणना (जेआईटी और वीएम अनुकूलन से बचने के लिए)। उत्तर इस तरह आता है:
(480+511+511)/(640+644+663) = 1502/1947 = 501/639 = 100/128
जब मैं अपने लैपटॉप पर कोशिश करता हूं तो मुझे यह व्यवहार नहीं दिखता है, लेकिन यह प्लेटफार्म-निर्भर होने की संभावना है। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि यदि आप पूरे सरणी के लिए एक ही समय में स्थान आवंटित करते हैं, तो यह पहले स्मृति को स्वैप कर सकता है, जो चीजों को धीमा कर सकता है। – ajb
कौन सा जेवीएम? 64 बिट जावा 'सर्वर' वीएम पर डिफ़ॉल्ट है, जो कि 32 बिट जावा के लिए डिफ़ॉल्ट वीएम की तुलना में जेआईटी-अधिक आक्रामक रूप से संकलित करता है। तो आप कभी-कभी 32 बिट जावा के साथ अजीब perf मतभेद देखते हैं जो एक सभ्य जेआईटी-कंपाइलर ऑप्टिमाइज़ कर देगा। –
जो आप देख रहे हैं वह शायद शोर है। यादृच्छिक पीढ़ी के बजाय हर बार "1" जोड़ने का प्रयास करें। –