मैं ऑब्जेक्ट आवंटन के संबंध में कुछ प्रदर्शन परीक्षण कर रहा था, जब मैं एक अजीब परिणाम में आया था।जावा: फ़ंक्शन को बार-बार कॉल करते समय प्रदर्शन में वृद्धि का कारण क्या होता है?
public static long TestMethod(){
int len = 10000000;
Object[] obs = new Object[len];
long t = System.nanoTime();
for (int i = 0; i < len; i++) {
obs[i] = new Object();
}
return System.nanoTime() - t;
}
public static void main(String... args) throws InterruptedException {
for(int i = 0; i < 10; i++){
System.gc();
System.gc();//Wait for the gc to be finished
Thread.sleep(1000);
System.out.println(TestMethod());
}
}
उम्मीद: मैं निम्नलिखित जावा कोड है सबसे पहले कॉल की वजह से ऑपरेटिंग सिस्टम और हॉटस्पॉट संवर्द्धन से एक बड़ा स्मृति स्थान का अनुरोध करने के लिए तो दूसरी कॉल धीमी हो जाएगा। लेकिन दूसरा और तीसरा लगभग समान होगा।
अवलोकन किया गया परिणाम:
11284734000
799837000
682304000
304736000
380770000
392786000
374279000
381611000
379174000
407256000
फिर भी तीसरे और चौथे चरण के बीच एक काफी गति को। इस गति का कारण क्या है? मैं कैसे सुनिश्चित कर सकता हूं कि अन्य कार्यों का परीक्षण करते समय मेरे माप सटीक हैं, क्या मुझे मापने से पहले चार गुना अधिक फ़ंक्शन को कॉल करना होगा?
[जस्ट-इन-टाइम संकलक स्टार्टअप देरी] (http://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations) –
दिलचस्प पढ़ने: http://stackoverflow.com/questions/504103/कैसे-करें-मैं-लिखने-एक-सही-माइक्रो-बेंचमार्क-इन-जावा - विशेष रूप से, '-XX: + प्रिंटकंपिलेशन -verbose के साथ चल रहा है: जीसी' वीएम पैरामीटर आपको यह समझने में मदद करेगा कि क्या हो रहा है। – assylias
@ वासिलियास: दिलचस्प। उन पैरामीटर को नहीं पता था। ऐसा लगता है कि यह दूसरी कॉल में फ़ंक्शन को दोबारा जोड़ रहा है, और पहले तीन कॉल में 2 कचरा संग्रह कर रहा है, और अंतिम कॉल फ़ंक्शन कॉल में कोई कचरा संग्रह नहीं कर रहा है। – user23127