2011-02-16 12 views
7

मैं कई मापों को इकट्ठा करने और उन्हें संसाधित करने के लिए time मैक्रो पर कॉल के परिणामों को कैप्चर करना चाहता हूं। मैंने स्थानीय आउटपुट setf मानक आउटपुट की कोशिश की और इसे एक स्ट्रिंग पर रीडायरेक्ट किया लेकिन यह time मैक्रो के साथ काम नहीं किया। हो सकता है कि यह गलत है, लेकिन मैं क्या करने की कोशिश की है:लिस्प में मैं अभिव्यक्ति का मूल्यांकन करने में व्यतीत समय को कैसे माप और कैप्चर कर सकता हूं?

(with-output-to-string (str) 
    (let ((*standard-output* str)) 
     (time (test-with-size 40)))) 

सवाल:

  1. time के उत्पादन में कब्जा करने के लिए कोई तरीका है?
  2. यदि नहीं, तो क्या मैं slime-profile-report कमांड के आउटपुट को कैप्चर कर सकता हूं?
  3. यदि उपरोक्त में से कोई भी काम नहीं करता है, तो मैं मनमाने ढंग से अभिव्यक्ति का मूल्यांकन करने में व्यतीत समय को कैसे माप सकता हूं?

जो मैं पूरा करना चाहता हूं वह इनपुट एल्गोरिदम के रन-टाइम को मापने के लिए है क्योंकि प्रत्येक इनपुट आकार (1 से 100 तक) के लिए इनपुट बढ़ता है, मैं कई बार मापता हूं और रखता हूं औसत। फिर मैं परिणाम साजिश करना चाहता हूं। प्लॉटिंग आसान है, और मुझे क्लिकी में कई तरीके मिले हैं, लेकिन मैं परिणाम कैसे एकत्र कर सकता हूं?

मैं सीएलआईएसपी और सीसीएल का उपयोग कर रहा हूं।

संपादित करें: Paul Nathan ने इंगित किया कि time मैक्रो आउटपुट *trace-output* पर एक समाधान है। हालांकि मुझे एक अच्छा, सरल, समाधान चाहिए, क्योंकि इस के साथ, मुझे एक कार्यान्वयन विशिष्ट ट्रेस को पार्स करना होगा।

+1

क्या आपने एकाधिक-मूल्य-बाइंड की कोशिश की है? इसके अलावा, http://www.lispworks.com/documentation/HyperSpec/Body/m_time.htm कहता है कि यह * ट्रेस-आउटपुट * स्ट्रीम को लिखता है। –

+0

धन्यवाद। बहु-मूल्य-बाइंड काम नहीं करता है क्योंकि समय तर्क अभिव्यक्ति मूल्यांकन का परिणाम देता है। लेकिन ट्रेस-आउटपुट काम करता है, हालांकि यह कच्चा उत्पादन है जिसे मुझे पार्स करना होगा। क्या इस कार्यान्वयन विशिष्ट ट्रेस को पार करने से बचने के लिए कोई और "सुरुचिपूर्ण" तरीका है? – Paralife

उत्तर

9

यदि आप टेक्स्ट को कैप्चर करना चाहते हैं, तो आपको सही स्ट्रीम का उपयोग करने की आवश्यकता है। एएनएसआई सीएल मानक का कहना है कि उत्पादन का पता लगाने के लिए समय प्रिंट करता है।

तो यह आपको एक स्ट्रिंग के रूप में पाठ देगा।

(with-output-to-string (*trace-output*) 
    (time (sin 40.0))) 

आप समय प्राइमेटिव का उपयोग करके अपना खुद का मैक्रो भी लिख सकते हैं। संख्यात्मक डेटा प्राप्त करने के लिए 25.1.4.3 Internal Time देखें।

+0

पॉल नाथन ने यह भी बताया कि अभी भी यह बदसूरत है ... ट्रेस को पार्स कर रहा है ... इसके अलावा आपको एक var नाम की आपूर्ति करने की आवश्यकता है। कम से कम clisp सादा (आउटपुट-टू-स्ट्रिंग (* मानक-आउटपुट *) के साथ शिकायत करता है (आउटपुट-टू-स्ट्रिंग (var) (चलो ((* मानक-आउटपुट * var)) ... – Paralife

+0

आंतरिक समय वह नहीं है जिसे मैं आशा करता हूं, विशेष रूप से आपके द्वारा प्रदान किए गए हाइपरपेक लिंक के निचले हिस्से में नोट्स के कारण। बेशक यह किसी न किसी अनुमान के लिए त्वरित और गंदे नौकरी कर सकता है अगर मुझे पता चलता है कि किस तरह के क्लिस में वर्णित सभी पहलुओं को लागू किया गया है नोट्स, लेकिन फिर भी ऐसा कुछ नहीं है जिसे मैं भरोसा करना चाहता हूं यदि मैं कुछ अच्छे परिशुद्धता के साथ कुछ परिणाम प्रस्तुत करना चाहता हूं। – Paralife

+1

मुझे आश्चर्य है कि वर्तमान में, जब किसी को किसी लिस्प "प्रोग्राम" के प्रदर्शन को मापने और प्रकाशित करने की आवश्यकता होती है माप के कुछ ग्राफ, वह जानकारी कैसे एकत्र करता है? क्या इस उद्देश्य के लिए उपयोग किए जाने वाले कुछ उपकरण या भाषा सुविधाओं वाले कोई नुस्खा नहीं है? क्या हर कोई अपना माप टूलकिट लिखता है? – Paralife

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