2013-01-31 43 views
8

मैंने कुछ सी कोड लिखा है जिसे मैं MATLAB का उपयोग करके संकलित करने के बाद MATLAB फॉर्म कहता हूं। सी कोड के अंदर, मैं निम्नलिखित कोड का उपयोग कर एक हिस्सा गणना के के समय को मापने:MATLAB की टिक-टोक और सी की घड़ी विसंगति

clock_t begin, end; 
double time_elapsed; 
begin = clock(); 
/* do stuff... */ 
end = clock(); 
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC); 

बीता हुआ समय सेकंड में निष्पादन समय होना चाहिए।

मैं फिर MATLAB में time_elapsed मान आउटपुट (यह ठीक से निर्यात किया गया है; मैंने चेक किया है)। फिर MATLAB-side मैं इस सी फ़ंक्शन को कॉल करता हूं (जब मैं इसे MEX का उपयोग करके संकलित करता हूं) और मैं tic और toc का उपयोग करके इसके निष्पादन समय को मापता हूं। एक पूर्ण बेतुकापन क्या होता है यह है कि जब मैं टिक और टीओसी का उपयोग कर गणना करता हूं तो 0.0011s (500 रनों पर औसत, सेंट देव 1.4e-4) है जबकि सी कोड द्वारा लौटाया गया समय 0.037 है (500 रनों पर औसत, सेंट देव 0.0016)।

  1. पूरे समारोह के लिए निष्पादन समय कोड का एक हिस्सा के लिए निष्पादन समय से कम है:

    यहाँ एक दो बहुत ही अजीब तथ्यों देख सकते हैं। इसलिए, या तो MATLAB या सी के माप दृढ़ता से गलत हैं।

  2. सी कोड में मापा निष्पादन समय बहुत बिखरे हुए हैं और बहुत अधिक सेंट प्रदर्शित करते हैं। विचलन (टीआईसी-टोक के लिए केवल 13% की तुलना में 44% भिन्नता का सहानुभूति)।

इन टाइमर के साथ क्या चल रहा है?

+0

घड़ी का संकल्प क्या है? हम कैसे जानते हैं कि 'start = clock();' घड़ी के ठीक पहले या बस ठीक से निष्पादित किया गया है? क्या यह परिणाम को प्रभावित करता है? शायद। –

+0

@ बोपर्सन तो, आपका मतलब है कि 'घड़ी()' सबसे अधिक टिक टिक सकता है? –

+4

मेरा मतलब है कि एक टिक परिणाम को प्रभावित करने के लिए काफी बड़ा हो सकता है। 18 एमएस की तरह –

उत्तर

6

आप संतरे से सेब की तुलना कर रहे हैं। मैटलैब के दस्तावेज़ पर

देखो:

टिक - http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html

टिक और toc आप वास्तविक गुजरे समय को मापने करते हैं।

अब घड़ी फ़ंक्शन http://linux.die.net/man/3/clock देखें।

विशेष रूप से,

घड़ी() फ़ंक्शन प्रोसेसर समय कार्यक्रम द्वारा प्रयोग किया जाता का एक सन्निकटन देता है।

लौटाया गया मान CPU समय अब ​​तक उपयोग किया गया है घड़ी_टी के रूप में; पर उपयोग किए गए सेकंड की संख्या प्राप्त करें, CLOCKS_PER_SEC द्वारा विभाजित करें। यदि प्रसंस्करण समय का उपयोग उपलब्ध नहीं है या इसका मान नहीं हो सकता है, तो फ़ंक्शन मान (clock_t) -1 देता है।

तो क्या अपने अंतर के कर सकते हैं:

  • CPU समय और वास्तविक बीता हुआ समय (टिक और toc द्वारा मापा गया) (घड़ी() द्वारा मापा गया) ही नहीं हैं। तो आप उम्मीद करेंगे कि सीपीयू का समय बीतने से कम समय से कम होगा? शायद हो सकता है।क्या होगा यदि 0.0011 के भीतर आप 100 कोर पर 10 कोर चला रहे हैं? इसका मतलब यह होगा कि घड़ी() माप 10x है जो टिक और टोक के साथ मापा जाता है। संभव, असंभव।
  • घड़ी (।) पूरी तरह से गलत है, और दस्तावेज़ीकरण के अनुरूप है, यह अनुमानित सीपीयू समय माप है! मुझे संदेह है कि यह शेड्यूलर क्वांटम आकार के लिए आंका गया है, लेकिन मैंने जांचने के लिए लिनक्स कर्नेल कोड के माध्यम से खोद नहीं किया। मैंने अन्य ओएसई पर भी जांच नहीं की, लेकिन this dude's blog उस सिद्धांत के अनुरूप है।

तो क्या करना है ... शुरुआत करने वालों के लिए, सेब से सेब की तुलना करें! इसके बाद, सुनिश्चित करें कि आप खाता टाइमर रिज़ॉल्यूशन लेते हैं।

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

  • कोई संबंधित समस्या नहीं^_^