2010-06-14 19 views
40

मुझे पता है कि मैं फ़ंक्शन का मूल्यांकन करने के लिए समय ले सकता हूं, टाइम फ़ंक्शन/मैक्रो का उपयोग करके स्क्रीन/स्टडआउट पर मुद्रित किया जा सकता है।क्लोजर में फ़ंक्शंस को कैसे बेंचमार्क करें?

समय मैक्रो मूल्यांकन किए गए फ़ंक्शन का मान देता है, जो इसे इनलाइन का उपयोग करने में बहुत अच्छा बनाता है। हालांकि मैं विशिष्ट परिस्थितियों में स्वचालित रूप से रनटाइम को मापना चाहता हूं।

क्या कोई ऐसा कार्य है जो इस बेंचमार्किंग में सहायता के लिए कुछ लाइब्रेरी में विलुप्त समय लौटाता है?

+0

[क्लोजर के लिए प्रोफाइलिंग टूल] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2974916/profiling-tool-for-clojure) –

+0

मुझे ऐसा नहीं लगता है, संदर्भित प्रश्न है बाहरी बेंचमार्किंग के बारे में, यह प्रश्न कोड को मापने के बारे में अधिक है। मुझे आश्चर्यचकित होना चाहिए कि कोई 5 साल के प्रश्नों में डुप्लिकेट की तलाश में है। हुड के नीचे खोदने के लिए मैक्रोएक्सपैंड का उपयोग करने के लिए –

उत्तर

27

आप क्लोजर - Criterium के लिए ह्यूगो डंकन की बेंचमार्किंग लाइब्रेरी में देखना चाहेंगे।

README से

: एक अभिव्यक्ति की

क्रिटेरियम उपायों गणना समय। यह बेंचमार्किंग के कुछ नुकसान, और विशेष रूप से जेवीएम पर बेंचमार्किंग को संबोधित करने के लिए डिज़ाइन किया गया है।

इसमें शामिल हैं:

  • कई मूल्यांकनों के सांख्यिकीय संसाधन
  • एक वार्म अप अवधि, JIT कम्पाइलर परीक्षण से पहले अपने कोड जीसी की
  • शुद्धिकरण अनुकूलन करने के लिए अनुमति देने के लिए डिज़ाइन किया गया के शामिल किए जाने, अलग करने के लिए जीसी राज्य से समय
  • एक अंतिम मजबूर जीसी परीक्षण समय पर सफाई के प्रभाव का अनुमान लगाने के परीक्षण के बाद से पहले परिणाम
30

यदि यह केवल स्ट्रिंग को प्रोग्रामेटिक रूप से कैप्चर करना चाहते हैं, तो आप समय का उपयोग करने से पहले * कुछ * को बाध्य कर सकते हैं।

user=> (def x (with-out-str (time (+ 2 2)))) 
#'user/x 
user=> x 
"\"Elapsed time: 0.119 msecs\"\n" 

आप प्रारूप पर अधिक नियंत्रण चाहते हैं, तो आप अपने खुद के है जो जावा के सिस्टम समय तरीकों का उपयोग कर समय के संस्करण बना सकते हैं, क्या हुड के नीचे समय मैक्रो का उपयोग करता है वैसे भी:

user => (macroexpand '(time (+ 2 2))) 
(let* [start__4197__auto__ (. java.lang.System (clojure.core/nanoTime)) 
     ret__4198__auto__ (+ 2 2)] 
    (clojure.core/prn (clojure.core/str "Elapsed time: " (clojure.core//  
      (clojure.core/double 
       (clojure.core/- (. java.lang.System (clojure.core/nanoTime)) 
           start__4197__auto__)) 1000000.0) " msecs")) 
ret__4198__auto__) 

उस मूल संरचना को लें और कॉल को prn पर बदलें जो आप चाहें जो भी रिपोर्टिंग तंत्र चाहते हैं।

+4

+1! – mikera

+1

धन्यवाद, मैं इसे भी शुरू करने के लिए देख रहा था। मानदंड पुस्तकालय वास्तव में बिल फिट बैठता है। लेकिन जब तक आप हास्केल लाइब्रेरी को नहीं जानते हैं, तो आप Google का उपयोग करके दुर्घटना से उस पर ठोकर नहीं जा रहे हैं। –

+1

@ पीटर टिलमैन वेल, _now_ हम हैं, यह देखते हुए कि स्टैक ओवरफ्लो में इसका उल्लेख है। :-) –

0

यदि आप अपने कार्यों के लिए जावा बाध्यकारी उत्पन्न करते हैं (और कुछ क्लोजर मेवेन प्लगइन पुनर्गठन के साथ), तो आप जेएमएच (http://openjdk.java.net/projects/code-tools/jmh/) का भी उपयोग कर सकते हैं जो शायद सबसे अच्छा जेवीएम माइक्रोबॉन्मार्किंग दोहन है। https://github.com/circlespainter/pulsar-auto-instrument-bench

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