2013-04-14 10 views
10

के साथ लिनक्स कर्नेल स्पेस में मापने का समय मैं वर्तमान में कर्नेल में समय मापने के लिए do_gettimeofday() फ़ंक्शन का उपयोग कर रहा हूं, जो मुझे माइक्रोसेकंड सटीकता देता है। क्या वहां कुछ भी उपलब्ध है जो इससे अधिक सटीक है (शायद नैनोसेकंड के क्रम पर)?उप-माइक्रोसेकंड प्रेसिजन

+1

आप वास्तव में "ठीक" मापने के लिए क्या चाहते हैं ...? और आपका हार्डवेयर उतना निर्धारक नहीं है जितना आप सोचते हैं (कैश मिस समय को बहुत बदल सकता है) –

+0

मैं उस समय को मापना चाहता हूं जब यह एक निश्चित ऑपरेशन करने के लिए हार्डवेयर का एक निश्चित टुकड़ा लेता है। मैं इसे अपने ड्राइवर में माप रहा हूं। –

उत्तर

14

ktime_get() फ़ंक्शन ktime_t, जो संकल्प nanosecond गया है।

+1

इस फ़ंक्शन का उपयोग करने वाला निम्न कोड 0 का उत्पादन करता है: लंबे समय तक int nsTime = ktime_to_ns (ktime_get()); \t प्रिंटक ("एनएस में प्रारंभ समय% d" है, एनएसटाइम); कोई विचार क्यों? –

+3

@ जॉन रॉबर्ट्स: आपको 'लंबे समय तक int' प्रिंट करने के लिए '% lld' का उपयोग करने की आवश्यकता है। – caf

+1

@caf: मुझे एक ही समस्या है, यानी, मुझे 0 एनएस मिल रहा है। कोड ऐसा कुछ दिखता है ... प्रारंभ = ktime_get(); ... फ़ंक्शन(); ... अंत = ktime_get(); वास्तविक_टाइम = ktime_to_ns (ktime_sub (अंत, प्रारंभ)); प्रिंटक (KERN_INFO "समय लिया गया =% lld \ n", (लंबा लंबा) वास्तविक_टाइम); –

4

जैसा कि मुझे पता है, सबसे सटीक टाइमर प्रोसेसर विशिष्ट काउंटर रजिस्टर (जैसे x12 में TSC) होना चाहिए। लिनक्स कर्नेल इस रजिस्टर मान को पढ़ने के लिए "./arch/x86/include/asm/msr.h" फ़ाइल से rdtsc, rdtscl, rdtscll मैक्रोज़ प्रदान करता है। एआरएम के लिए, cycle counter register

ये रजिस्ट्रार सीपीयू से सीपीयू के लिए अलग हैं। इसे एक्सेस करने के लिए सामान्य इंटरफ़ेस "get_cycles" फ़ंक्शन है जिसे फ़ाइल में घोषित किया गया है।

शायद, this document सहायक हो सकता है।

+1

बहु-कोर मशीनों की बात करते समय टीएससी बहुत अविश्वसनीय नहीं है? –

+0

आप सही हैं। बहु-कोर मशीन में, किसी विशिष्ट CPU से TSC रजिस्टर का उपयोग करने के लिए सावधान रहना चाहिए। – Wonil

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