2012-06-21 11 views
5

यहाँ मैं स्थानीय, सदस्य, अस्थिर सदस्य की पहुँच गति के बारे में एक परीक्षण लिखा है:क्यों अस्थिर चर का उपयोग सदस्य की तुलना में लगभग 100 धीमी है?

दौर: 1 खाली: 5

public class VolatileTest { 

public int member = -100; 

public volatile int volatileMember = -100; 

public static void main(String[] args) { 
    int testloop = 10; 
    for (int i = 1; i <= testloop; i++) { 
     System.out.println("Round:" + i); 
     VolatileTest vt = new VolatileTest(); 
     vt.runTest(); 
     System.out.println(); 
    } 
} 

public void runTest() { 
    int local = -100; 

    int loop = 1; 
    int loop2 = Integer.MAX_VALUE; 
    long startTime; 

    startTime = System.currentTimeMillis(); 
    for (int i = 0; i < loop; i++) { 
     for (int j = 0; j < loop2; j++) { 
     } 
     for (int j = 0; j < loop2; j++) { 
     } 
    } 
    System.out.println("Empty:" + (System.currentTimeMillis() - startTime)); 

    startTime = System.currentTimeMillis(); 
    for (int i = 0; i < loop; i++) { 
     for (int j = 0; j < loop2; j++) { 
      local++; 
     } 
     for (int j = 0; j < loop2; j++) { 
      local--; 
     } 
    } 
    System.out.println("Local:" + (System.currentTimeMillis() - startTime)); 

    startTime = System.currentTimeMillis(); 
    for (int i = 0; i < loop; i++) { 
     for (int j = 0; j < loop2; j++) { 
      member++; 
     } 
     for (int j = 0; j < loop2; j++) { 
      member--; 
     } 
    } 
    System.out.println("Member:" + (System.currentTimeMillis() - startTime)); 

    startTime = System.currentTimeMillis(); 
    for (int i = 0; i < loop; i++) { 
     for (int j = 0; j < loop2; j++) { 
      volatileMember++; 
     } 
     for (int j = 0; j < loop2; j++) { 
      volatileMember--; 
     } 
    } 
    System.out.println("VMember:" + (System.currentTimeMillis() - startTime)); 

} 
} 

और यहाँ मेरी X220 (I5 सीपीयू) पर एक परिणाम है स्थानीय: 10 सदस्य: 312 VMember: 33378

दौर: 2 खाली: 31 स्थानीय: 0 सदस्य: 294 VMember: 33180 +०१२३०४७३६०९१

दौर: 3 खाली: 0 स्थानीय: 0 सदस्य: 306 VMember: 33085

दौर: 4 खाली: 0 स्थानीय: 0 सदस्य: 300 VMember: 33066

दौर: 5 खाली: 0 स्थानीय: 0 सदस्य: 303 VMember: 33078

,210 दौर: 6 खाली: 0 स्थानीय: 0 सदस्य: 299 VMember: 33398

दौर: 7 खाली: 0 स्थानीय: 0 सदस्य: 305 VMember: 33139

दौर: 8 खाली: 0 स्थानीय: 0 सदस्य: 307 VMember: 33490

दौर: 9 खाली: 0 स्थानीय: 0 01,235,सदस्य: 350 VMember: 35291

दौर: 10 खाली: 0 स्थानीय: 0 सदस्य: 332 VMember: 33838

यह मेरे अस्थिर सदस्य तक पहुँच हैरान कर 100 बार सामान्य सदस्य की तुलना में धीमी । मुझे पता है कि अस्थिर सदस्य के बारे में कुछ हाइलाइट फीचर है, जैसे कि इसमें एक संशोधन तुरंत सभी थ्रेड के लिए दिखाई देगा, अस्थिर चर के लिए एक्सेस पॉइंट "मेमोरी बाrier" की भूमिका निभाता है। लेकिन क्या ये सभी दुष्प्रभाव 100 गुना धीमा हो सकता है?

पीएस: मैंने कोर II सीपीयू मशीन पर भी एक परीक्षण किया। यह लगभग 9:50 है, लगभग 5 गुना धीमा है। ऐसा लगता है कि यह सीपीयू कमान से भी संबंधित है। 5 गुना अभी भी बड़ा है, है ना?

+0

संभावित डुप्लिकेट [क्या अस्थिर महंगा है?] (Http://stackoverflow.com/questions/4633866/is-volatile-expensive) –

+0

इसे देख रहा है ... – DeepNightTwo

उत्तर

3

volatile तक कुछ कुछ जेआईटी ऑप्टिमाइज़न को रोकता है।यह विशेष रूप से महत्वपूर्ण है यदि आपके पास एक लूप है जो वास्तव में कुछ भी नहीं करता है क्योंकि जेआईटी ऐसे लूप को दूर कर सकता है (जब तक आपके पास अस्थिर क्षेत्र न हो) यदि आप लूप को "लंबा" चलाते हैं तो विलुप्त होने और अधिक बढ़ना चाहिए।

अधिक यथार्थवादी परीक्षण में, आप volatile की अपेक्षा कर सकते हैं ताकि सैटिकल कोड के लिए 30% और 10x धीमी हो। अधिकांश वास्तविक कार्यक्रमों में यह बहुत कम अंतर बनाता है क्योंकि सीपीयू "एहसास" करने के लिए पर्याप्त स्मार्ट है कि केवल एक कोर अस्थिर क्षेत्र का उपयोग कर रहा है और मुख्य स्मृति का उपयोग करने के बजाय इसे कैश करता है।

3

volatile चर तक पहुंच सीपीयू को पहले और बाद में निर्देशों को फिर से ऑर्डर करने से रोकती है, और यह आमतौर पर निष्पादन को धीमा कर देती है।

6

अस्थिर सदस्यों को कभी कैश नहीं किया जाता है, इसलिए वे मुख्य स्मृति से सीधे पढ़े जाते हैं।

+0

बिल्कुल। यह स्वीकार्य उत्तर क्यों नहीं था। –

संबंधित मुद्दे