2013-05-08 5 views
8

जबकि बनाम करते-करते हुएक्या परिस्थितियों में कर सकते हैं-जबकि अधिक से अधिक कुशल हो?

जबकि और कर-, जबकि कार्यात्मक रूप से बराबर जब ब्लॉक खाली हैं, हालांकि, जबकि अधिक प्राकृतिक लगता है:

थोड़ी देर के
do {} while (keepLooping()); 
while (keepLooping()) {} 

एक ठेठ उपयोग के मामले/एक खाली ब्लॉक के साथ-साथ परमाणु वस्तुओं के एक अद्यतन औरसेट (सीएएस) के साथ एक बल को मजबूर करना है। उदाहरण के लिए नीचे दिए गए कोड एक धागा सुरक्षित रास्ते में a बढ़ेगी, जब:

int i; 
AtomicInteger a = new AtomicInteger(); 
while (!a.compareAndSet(i = a.get(), i + 1)) {} 

प्रसंग

java.util.concurrent के कई भागों कैस के संचालन के लिए do {} while (...) मुहावरा और ForkJoinPool की जावाडोक बताते का उपयोग :

असामान्य do {} while (!cas...) की कई घटनाएं हैं जो एक सीएएसएड वैरिएबल के अद्यतन को मजबूर करने का सबसे आसान तरीका है।

के बाद से वे स्वीकार करते हैं कि यह असामान्य है, मैं वे सबसे अच्छा बजाय सरल मतलब लगता है।

प्रश्न

वहाँ स्थितियों में, जहां do {} while (!cas)while (!cas) {} से और क्या कारणों के लिए अधिक कुशल हो सकता है?

+0

शायद यह सिर्फ ऐतिहासिक वरीयता है। वैसे भी, क्यों '{} 'बिल्कुल --- --- (शर्त) का उपयोग करें;' मैं यही लिखूंगा। –

+1

@ मार्कोटोपॉलिक ''' पर सहमत हुए। मैंने पाया [यह वीडियो] (http://emergingtech.chariotsolutions.com/2013/04/phillyete-screencast-7-doug-lea-engineering-concurrent-library-components/), जहां डौग ली कहता है लगभग 57:00 : "* सुरक्षित बिंदुओं के कारण, समय-समय पर उपयोग न करें," और स्लाइड "छोटी दौड़ विंडो" का उल्लेख करती है। मुझे लगता है कि वह जीसी सुरक्षित बिंदुओं को संदर्भित करता है हालांकि मुझे नहीं लगता कि यह यहां कैसे अंतर करता है। – assylias

+1

डौग इस बारे में काफी अंडाकार है :) सबसे अच्छा तरीका मैं इसे समझ सकता हूं, जबकि बनाम बनाम के बारे में नहीं है, लेकिन लूप बॉडी का उपयोग असाइनमेंट बनाम सभी चीजों को क्रैम करने के लिए करना है। –

उत्तर

0

ऐसी परिस्थितियां हो सकती हैं जहां अपेक्षा और गणना की गणना जटिल होती है, जैसा कि आप तुलना करते हैं और सेट करते हैं। तो फिर तुम इसे और अधिक एक करते अंदर पठनीय बना सकता है:

do { 
    int expect = a.get(); 
    int update = expect + 1; 
} while (!a.compareAndSet(expect, update)); 
+0

प्रश्न खाली ब्लॉक मानता है ताकि जबकि और कब-समय सख्ती से बराबर हो। – assylias

+0

आह। मैबी यह अधिक है –

+0

इसे वास्तविक उदाहरण के लिए देखें: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/ForkJoinPool। जावा # ForkJoinPool.postBlock% 28% 29 - मुझे नहीं लगता कि यह मुद्दा है। – assylias

0

यह दक्षता का सवाल नहीं है। कुछ मामलों को {} जबकि() के बिना हल नहीं किया जा सकता है। Java.util.Random.next (int बिट्स) देखें। यदि आप इसे() {} के साथ ऐसा करने का प्रयास करते हैं, तो आपके पास एक कोड डुप्लिकेट होगा, क्योंकि चक्र से पहले चक्र निकाय को निष्पादित किया जाना चाहिए।

मैंने पहले से ही एक बहुत ही समान प्रश्न पूछा है: compiling loops in Java

इस कोड:

public class Test { 

    static int i = 0; 

    public static void main(String[] args) { 
     method1(); 
     method2(); 
    } 

    public static void method2() { 
     do{}while(++i < 5); 
    } 

    public static void method1() { 
     while(++i < 5); 
    } 
} 

में संकलित किया गया है:

public static void method2(); 
    Code: 
    0: getstatic  #4; //Field i:I 
    3: iconst_1 
    4: iadd 
    5: dup 
    6: putstatic  #4; //Field i:I 
    9: iconst_5 
    10: if_icmplt  0 
    13: return 

public static void method1(); 
    Code: 
    0: getstatic  #4; //Field i:I 
    3: iconst_1 
    4: iadd 
    5: dup 
    6: putstatic  #4; //Field i:I 
    9: iconst_5 
    10: if_icmpge  16 
    13: goto 0 
    16: return 

आप Method1 में लाइन 13 पर अतिरिक्त अनुदेश ध्यान दे सकते हैं()। लेकिन जैसा कि मेरे प्रश्न में उत्तर द्वारा सुझाया गया था, जेआईटी द्वारा मशीन निर्देशों में संकलित होने पर इसका कोई फर्क नहीं पड़ता है। बहुत छद्म प्रदर्शन में सुधार। इसे साबित करने का कोई भी तरीका आपको प्रिंटएस्परब्स कुंजी के साथ चलाना होगा। सिद्धांत विधि 2 में तेज़ है, लेकिन व्यवहार में वे बराबर होना चाहिए।

+2

आपने सावधानी से पर्याप्त प्रश्न नहीं पढ़ा है। कोई लूप बॉडी नहीं है और अंतिम देशी कोड ऑर्डरिंग के संबंध में दक्षता का सवाल बहुत कम स्तर है। –

+0

मैंने अभी विधानसभा पर एक नज़र डाली है और कुछ भी मुझे मारता नहीं है। – assylias

+0

आपका क्या मतलब है? क्या यह सब वही है? – Mikhail

2

तो 'थोड़ी देर' का अर्थ है कि यह एक बार लूप में कोड चलाएगा। फिर, यह स्थिति सही होने पर केवल लूप के अंदर कोड चलाती है।

सरल प्रदर्शन

boolean condition = false; 

do{ 
    System.out.Println("this text displayed"); 
}while(condition == true); 

आउटपुट

सामान्य

while(condition == true){ 
System.out.Println("this text displayed"); 
} 

उत्पादन ""

  • * कोई उत्पादन हालत झूठी होने के कारण दिखाया गया है "इस पाठ प्रदर्शित"।

आप कब या कहां उपयोग करेंगे, मैं इस आवश्यकता के पार नहीं आऊंगा ताकि मैं आपकी मदद नहीं कर सकूं। यह सिर्फ एक समस्या/आवश्यकता की पहचान करने और इसे हल करने के लिए जो कुछ आप जानते हैं उसका उपयोग करने का मामला है। लेगो के समान- यांत्रिक प्रकार 'ब्लॉक' नहीं।

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