2012-07-31 16 views
8

मैं विभिन्न स्केला प्रवेश पुस्तकालयों में हाल ही में तलाश रहे हैं, और उनमें से अधिकांश के रूप में उनके प्रवेश कार्यों को लागूप्रदर्शन कॉल-टू-मूल्य से बनाम कॉल-दर-नाम

def debug(s: => String) 

इसलिए यदि आपके पास डीबग लॉगिंग बंद है, तो यह कथन निष्पादित नहीं करेगा। हालांकि, मैं सिर्फ logula जो विशेष रूप से अपने फायदे में से एक

विपरीत स्काला प्रवेश करने पुस्तकालयों का एक बहुत, Logula उपयोग नहीं करता है के रूप में राज्य भर में आया था पास-दर-नाम अर्थ विज्ञान (जैसे, च: => ए)

  • स्काला संकलक प्रत्येक प्रवेश बयान के लिए एक बंद बंद वस्तुओं को बनाने की जरूरत नहीं है: अपने प्रवेश बयान, के लिए जो दो बातें मतलब है। इससे कचरे की मात्रा संग्रह दबाव कम होनी चाहिए।

जो वास्तव में मुझे पूरी समझ में आता है। तो मेरा सवाल यह है कि क्या 2 दृष्टिकोणों की तुलना में कोई वास्तविक विश्व प्रदर्शन मानक/डेटा है? आदर्श रूप से एक जीवित परियोजना से कुछ विपरीत बेंचमार्क बनाम?

उत्तर

8

जो तेजी से उपयोग मामलों पर पूरी तरह से निर्भर करता है। यदि आप स्थैतिक तारों को लॉग कर रहे हैं, तो बस उस स्थिर स्ट्रिंग को पास करने और इसे अनदेखा करने के लिए तेज़ है। अन्यथा, यदि आप स्ट्रिंग बना रहे हैं तो आपको कम से कम एक ऑब्जेक्ट बनाना होगा। फंक्शन ऑब्जेक्ट्स छोटे और सस्ते होते हैं - यदि आप इसे अनदेखा करने जा रहे हैं तो आप स्ट्रिंग की तुलना में उनमें से किसी एक को बनाना बंद कर सकते हैं।

व्यक्तिगत रूप से, मुझे लगता है कि ट्रेडऑफ की पहली सिद्धांतों की समझ एक विशेष अनुप्रयोग के केस स्टडी से कहीं अधिक मूल्यवान है जो एक या दूसरे का उपयोग कर सकती है, क्योंकि यह आपको समझने देती है कि आप एक क्यों चुनेंगे या दूसरा (और आप अभी भी हमेशा अपने आवेदन को बेंचमार्क करना चाहते हैं)।

(नोट: कैसे महंगी वस्तु रचना है कैसे भारी असर पड़ा कचरा कलेक्टर जाता है पर निर्भर करता है, आम तौर पर, अल्पकालिक वस्तुओं बनाया है और का निपटारा किया जा सकता है 10 8 प्रति सेकंड के आदेश पर की दर, पर जो तंग आंतरिक लूप को छोड़कर चिंता नहीं होनी चाहिए। अगर आप कड़े आंतरिक लूप में लॉगिंग स्टेटमेंट डाल रहे हैं, तो मुझे लगता है कि कुछ गलत है। आपको इसके लिए यूनिट परीक्षण लिखना चाहिए।)

+1

'व्यक्तिगत रूप से, मुझे लगता है कि ट्रेडऑफ की पहली सिद्धांतों की समझ एक विशेष अनुप्रयोग के मामले के अध्ययन से कहीं अधिक मूल्यवान है' हालांकि मैं निश्चित रूप से यहां सिद्धांत के साथ सहमत हूं, वास्तविकता आप की तुलना में एक पूरी तरह से अलग जानवर हो सकती है आशा। यही कारण है कि मैं बेंचमार्क के बजाय वास्तविक जीवन के मामलों की तलाश में हूं, क्योंकि कोई भी बेंचमार्क लिख सकता है जो एक तरह से दस लाख गुना तेज दिखता है। अधिकतर मेरी जिज्ञासा के लिए, क्योंकि ईमानदारी से, वास्तव में कौन सा आवेदन लॉगिंग कर रहा है? – Falmarri

+0

@ फाल्मररी - यदि आप उदाहरणों से कारण हैं तो यह _especially_ की अपेक्षा से अलग हो सकता है। यही कारण है कि मैंने मौलिक ट्रेडऑफ समझाया। मैं मानता हूं कि लॉगिंग अधिकांश अनुप्रयोगों में बाधा नहीं होनी चाहिए। –

+0

@ फाल्मररी वेल ... क्या आप सबकुछ मापते हैं? ऐसे लोग हैं जो कतार आकार, थ्रूपुट और प्रतिक्रिया समय सहित अपने आवेदन में हर कदम को मापकर कसम खाता है।यदि आप उस मार्ग पर जाते हैं, तो आप नहीं चाहते कि आपका लॉगिंग कुल समय में जोड़ जाए। वास्तव में, आप इसे async होना चाहते हैं। –

3

मैं बाहर जाऊंगा एक अंग पर और कहें कि ट्रेडऑफ के बारे में दार्शनिक चर्चाएं अधिक उपयोगी होती हैं जब कुछ रोचक ट्रेडऑफ बनने के लिए कहा जाता है, जो यहां नहीं है।

class A { 
    var debugging = true 
    @inline final def debug(msg: => String) = if (debugging) println(msg) 

    def f = { debug("I'm debugging!") ; 5 } 
} 
% scalac292 -optimise a.scala 
% ls -l *.class 
-rw-r--r-- 1 paulp staff 1503 Jul 31 22:40 A.class 
% 

बंद वस्तुओं की गणना करें।

+1

जानना बहुत अच्छा है! यद्यपि आप लॉगिंग करने के लिए बाहरी लाइब्रेरी की लॉग विधि का उपयोग करने का प्रयास कर रहे हैं, तो यह elision प्राप्त करना अधिक कठिन हो सकता है ... लेकिन यह तर्क देता है कि आपके पास अपनी स्थानीय '@inline अंतिम डीफ डीबग' लाइब्रेरी कॉल को लपेटना चाहिए उन स्थानों पर जहां आपको इसकी आवश्यकता है। –