2011-12-21 13 views
5

मैं microseconds (या बेहतर सटीकता) में लिनक्स के तहत किसी प्रोग्राम के निष्पादन के लिए लिया गया समय जानना चाहता हूं। वर्तमान में मैं time कमांड का उपयोग कर रहा हूं, लेकिन यह मुझे अधिकतम मिलीसेकंड सटीकता पर देता है। बेहतर सटीकता देने के लिए time कमांड को ट्विक करने का कोई तरीका है या इसके लिए कोई अन्य कमांड है?लिनक्स टाइम कमांड माइक्रोसेकंड या बेहतर सटीकता

उत्तर

8

आपका प्रश्न व्यर्थ है: आपको मिलीसेकंड समय के भीतर भी बार-बार माप नहीं मिलेगा।

अधिक अंक जोड़ना सिर्फ शोर जोड़ देगा। आप /dev/random से अतिरिक्त अंक भी खींच सकते हैं।

+0

मुझे आपकी बात समझ में नहीं आती है। मैंने कहा कि मैं मिलीसेकंड से बेहतर सटीकता चाहता हूं जो आज के प्रोसेसर पर असंभव नहीं है, जहां हम नैनोसेकंड सटीकता तक भी पहुंच सकते हैं। अधिक अंक जोड़ने से अधिक शोर कैसे जुड़ता है? –

+5

@ मार्गदर्शन क्योंकि गैर-रीयलटाइम ओएस पर चल रहे कोड में दृढ़ निष्पादन नहीं है। ओएस के लिए कुछ आईपी पैकेट्स, या किसी अन्य आर्बिटरी प्रक्रिया को चलाने के लिए या क्रॉन्ड जागने के लिए यह जांचने के लिए है कि यह कुछ करना चाहिए या फाइल सिस्टम को यह तय करना चाहिए कि इसे गंदे पेज आदि लिखना चाहिए और प्रक्रिया कुछ समय (थोड़ी सी) समय के लिए समय समाप्त हो जाता है और समय समाप्त हो जाता है। एक ओएस के बिल्टिन समय, जैसे सीपीयू टाइम (दीवार घड़ी के समय के विपरीत), आमतौर पर टाइम्सलाइस में गिना जाता है जिसमें एक निश्चित संकल्प होता है (अक्सर 1 कर्नेल टिक, 1 मिलीसेकंड या अधिक) – nos

+0

'समय/बिन/नींद 0.006' यह इंगित करता है कि शोर 1 मिलीसेकंड से कम है। इसलिए जब इस तरह के माप निश्चित रूप से खतरनाक हैं, Guanidene का अनुरोध प्रति अर्थहीन नहीं है। –

0

देखें कि क्या आपकी आवश्यकता में current_kernel_time() आपके लिए सहायक है। मैंने इसका उपयोग किया है और उपयोगी पाया क्योंकि यह नैनोसेकंद स्तर पर ग्रैन्युलरिटी देता है .. अधिक जानकारी here हैं।

4

मैं Employed Russian's answer से सहमत हूं। इस तरह के उपायों के लिए माइक्रोसॉन्ड सटीकता को समझना ज्यादा समझ में नहीं आता है। तो आपके पास जो भी अतिरिक्त अंक मिला है वह व्यर्थ है (और अनिवार्य रूप से यादृच्छिक)।

यदि आपके पास मापने के लिए एप्लिकेशन का स्रोत कोड है, तो आप clock या clock_gettime फ़ंक्शंस का उपयोग कर सकते हैं, लेकिन सटीकता के दर्जन से अधिक माइक्रोसेकंडों की अपेक्षा न करें। RDTSC मशीन निर्देश भी है।

linux clock howto पढ़ें।

और यह न भूलें कि निष्पादन का समय, अनुप्रयोग के दृष्टिकोण से, गैर निर्धारक और गैर पुनरुत्पादनीय (संदर्भ स्विच, कैश मिस, इंटरप्ट आदि के बारे में सोचें ... यादृच्छिक समय पर खुशहाली)।

यदि आप पूरे कार्यक्रम के प्रदर्शन को मापना चाहते हैं, तो इसे कम से कम कई सेकंड तक चलाएं, और कई बार (उदा। 8) बार मापें, और औसत लें (शायद सबसे अच्छा & सबसे खराब समय छोड़ना)।

आप विशेष कार्यों के लिए समय को मापने के लिए चाहते हैं, सीखें कि कैसे अपने आवेदन profile को (gprof, oprofile आदि आदि ...) भी देखें this question

मत भूलना पढ़ने के लिए time(7)

बनें जागरूक है कि वर्तमान (लैपटॉप, डेस्कटॉप, सर्वर) out-of-orderpipelinedsuperscalar जटिल CPU caches और TLB और और branch predictors के साथ प्रोसेसर, कुछ छोटे लूप या मशीन निर्देश के अनुक्रम का निष्पादन समय I पुन: उत्पन्न नहीं होता है (नैनोसेकंद गिनती एक रन से दूसरे तक भिन्न हो जाएगी)। और ओएस यादृच्छिकता भी जोड़ता है (scheduling, context switches, interrupts, page cache, copy-on-write, demand-paging ...) इसलिए यह एक कम से कम मिलीसेकंड के साथ कुछ कमांड के निष्पादन को मापने के लिए कोई समझ नहीं आता है - शायद 100μs यदि आप भाग्यशाली हैं- परिशुद्धता का आपको कई बार अपने आदेश का बेंचमार्क करना चाहिए।

महत्वपूर्ण उपाय प्राप्त करने के लिए, आपको बेंचमार्क किए गए एप्लिकेशन को कुछ सेकंड से अधिक समय में चलाने के लिए बदलना चाहिए (शायद main में कुछ लूप जोड़ना, या एक बड़े डेटा सेट के साथ चलाएं ...), और बेंचमार्क किए गए कमांड को एक दर्जन दोहराएं बार। यह उपाय (या सबसे खराब, या सबसे अच्छा, आप क्या कर रहे हैं के आधार पर) उपाय लेते हैं।

यदि सिस्टम time(1) पर्याप्त नहीं है, तो आप अपनी माप सुविधा बना सकते हैं; getrusage(2) भी देखें; मुझे आपके बारे में संदेह है कि आपको अधिक सटीक उपाय मिल रहे हैं।

BTW मेरी i3770K हाल जीएनयू/लिनक्स (4.2 कर्नेल, डेबियन/सिड/x86-64) डेस्कटॉप कंप्यूटर, "प्रणाली" time(2) या clock_gettime(2) रन के बारे में 3 या 4 नैनोसेकंड में -calls ( vdso(7) करने के लिए धन्यवाद जो से बचने पर

वास्तविक syscall ... का बोझ ...) ताकि आप उन्हें के अंदर अक्सर अपने प्रोग्राम का उपयोग कर सकें।

2

gettimeofday का उपयोग करें - माइक्रोसेकंड सटीकता

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