2014-05-03 7 views
5

मैं एक हास्केल प्रोग्राम चला रहा हूं जो एक लंबी गणना करता है।हास्केल प्रोफाइलिंग - घड़ी_gettime

$ /usr/bin/time -v ./hl test.hl 
9000045000050000 
Command being timed: "./hl test.hl +RTS" 
User time (seconds): 1.43 
System time (seconds): 1.15 

यह प्रणाली बहुत समय उपयोग कर रहा था, भले ही मेरी कोड स्पष्ट रूप से किसी भी प्रणाली कॉल (यह एक फ़ाइल पढ़ता है और इसमें कुछ कोड की व्याख्या) आह्वान नहीं करता है: कुछ रूपरेखा और ट्रेसिंग के बाद, मैं निम्नलिखित देखा।

strace -ttT के साथ चल रहा है एक टाइमर के लिए कॉल का एक बहुत से पता चलता:

17:04:52.454513 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {1, 282721271}) = 0 <0.000529> 
17:04:52.456223 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000720> 
17:04:52.458749 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000239> 
17:04:52.460288 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {1, 285126436}) = 0 <0.000255> 
17:04:52.461650 --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=0, si_value=0} --- 
17:04:52.462242 rt_sigreturn()   = 0 <0.000458> 

मैंने सोचा कि यह RTS clock हो सकता है, तो मैं इसे और फिर से रन अक्षम:

$ /usr/bin/time -v ./hl test.hl +RTS -V0 
9000045000050000 
Command being timed: "./hl test.hl +RTS -V0" 
User time (seconds): 1.73 
System time (seconds): 0.85 

strace उत्पादन वास्तविक SIGVTALRM के लिए छोड़कर लगभग समान लगता है:

17:05:16.409729 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {0, 155881514}) = 0 <0.000378> 
17:05:16.410746 clock_gettime(CLOCK_MONOTONIC, {2184631, 597586194}) = 0 <0.000432> 
17:05:16.412724 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {0, 156994988}) = 0 <0.000290> 
17:05:16.413832 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000245> 
17:05:16.415017 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000305> 

मैं एक है कुछ प्रश्न:

  1. हास्केल बार-बार घड़ी_gettime क्यों कॉल कर रहा है?
  2. क्या इस कार्यक्षमता को अक्षम करने का कोई तरीका है?
+0

हालांकि यह आपकी समस्या का समाधान नहीं है, लेकिन क्या आपने मानदंड को देखा - प्रोफाइलिंग के लिए? – epsilonhalbe

+0

क्या आप प्रोफाइलिंग के साथ चल रहे हैं? प्रोफाइलिंग अतिरिक्त काम करता है। – GarethR

+1

@GarethR: मैंने सुनिश्चित किया है कि मैं प्रोफाइलिंग के बिना दौड़ रहा हूं, इस तथ्य को सुनिश्चित करने के लिए एक नया कैबल सैंडबॉक्स भी बनाया है। –

उत्तर

0

मैं कहाँ clock_gettime GHC आरटीएस में कहा जाता है पर एक दृष्टि डाली और पाया कि यह getMonotonicTime के लिए एक कॉल में प्रयोग किया जाता है बदले में GHC.Event पुस्तकालय की TimerManager में समय समाप्ति का आधार है कि द्वारा इस्तेमाल किया जाता है कि हैंडल, फाइल, सिस्टम कॉल इत्यादि पर मतदान के लिए आईओ प्रबंधक MIO पेपर आईओ प्रबंधक पर एक अपेक्षाकृत हालिया संसाधन है। किसी भी मामले में, मुझे कल्पना नहीं है कि आप उन कॉल को खत्म करने में सक्षम होंगे।

यह भी ध्यान रखें, जबकि आप बहुत सारे उन घड़ी कॉल की देखते हैं, इसका मतलब यह नहीं है कि वे सिस्टम कॉल जो सबसे समय, जो मैं जी सी के लिए और अधिक संबंधित कल्पना ले जा रहे हैं, वास्तव में आईओ, आदि प्रदर्शन कर रहे हैं

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