linux

2009-09-04 18 views
9

पर तेजी से बीता हुआ समय मैं मैं jiffies का उपयोग कर विचार सीlinux

में एक समारोह के दो कॉल के बीच बीता हुआ समय प्राप्त करने के लिए एक तेजी से रास्ता खोज रहा है, लेकिन वे userland में उपलब्ध नहीं हैं। तो, मुझे getimeofday() का उपयोग करना चाहिए या ऐसा करने का कोई सबसे तेज़ तरीका है।

मुझे बेंचमार्क टूल में उपयोग करने के लिए केवल दो कॉल के बीच विस्तारित समय में दिलचस्पी है।

उत्तर

2

यदि आप x86/x64 आर्किटेक्चर पर हैं, और आप एक ही सीपीयू पर चल रहे हैं, तो आप चक्र-गणना प्राप्त करने के लिए सीपीयू पर टाइम-स्टैम्प काउंटर पढ़ने पर विचार कर सकते हैं। विकिपीडिया में more information है। ध्यान दें कि यदि आपका एप्लिकेशन एकाधिक CPU पर चल रहा है, तो यह दृष्टिकोण कम उपयोगी है, क्योंकि प्रत्येक सीपीयू का अपना टीएससी होगा। यदि आप निर्णय लेते हैं कि आप चक्रों -> समय इकाइयों को परिवर्तित करना चाहते हैं तो आवृत्ति स्केलिंग से भी सावधान रहें।

+0

RDTSC के लिए +1 ... – dmityugov

3

हां, gettimeofday() पर्याप्त होगा यदि आप वास्तविक विलुप्त होना चाहते हैं। यदि आपको CPU समय ढूंढना है, तो आप घड़ी() का उपयोग कर सकते हैं। कई मामलों में, दोनों दृष्टिकोण समान परिणाम देंगे (जब तक कोई नींद या कोड में कुछ प्रकार का इंतजार न हो)। घड़ी का एक उदाहरण() यहां पाया जा सकता:
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html

9

clock_gettime पर एक नज़र है, जो उच्च संकल्प टाइमर तक पहुँच प्रदान करता है।

+1

घड़ी_gettime() को CLOCK_MONOTONIC स्रोत के साथ सापेक्ष समय करने के लिए प्राथमिकता दी जाती है। gettimeofday() त्रुटि का प्रवण होता है यदि कोई उपयोगकर्ता या प्रक्रिया वर्तमान समय को बदल सकती है। – KFro

9

मुझे प्रोसेसर समय clock()time.h से प्राप्त होगा। उपयोगी मूल्यों को प्राप्त करने के लिए, मिलीसेकंड में बदलने का CLOCKS_PER_SEC के माध्यम से: अपने गिरी एक vsyscall (आभासी सिस्टम कॉल) के रूप में gettimeofday() का समर्थन करता है

clock_t start = clock(); 
// [...] 
clock_t end = clock(); 
unsigned long millis = (end - start) * 1000/CLOCKS_PER_SEC; 
+1

घड़ी() समय वास्तविक समय के बराबर नहीं लगता है। घड़ी का परीक्षण करने के बाद http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1 – xhan

+0

घड़ी के बाद() समय सिस्टम + उपयोगकर्ता समय लौटाता है लेकिन वास्तविक समय नहीं। इसके बजाय gettimeofday का उपयोग करें – xhan

+0

@xhan: आपके उपयोग के मामले पर निर्भर करता है - बेंचमार्किंग टूल के लिए, प्रोसेसर समय संभवतः वॉलक्लॉक समय – Christoph

1

है, तो इस का उपयोग करते हुए एक नियमित रूप से सिस्टम कॉल जैसे clock() बुला तुलना में तेजी से हो जाएगा। बनामस्कूल कैसे काम करते हैं, इस बारे में कुछ जानकारी के लिए Andrea Arcangeli's presentation देखें।

0

देर से जोड़ने की बिट, हालांकि किसी भी लिनक्स/यूनिक्स पर उपलब्ध समय क्षमता आप जो चाहते हैं उसे प्राप्त करने का हल्का वजन तरीका हो सकता है। यहाँ 2 उदाहरण CentOS पर मेरे लिए

time ls -l stuff* 
ls: stuff*: No such file or directory 
    0.01s real  0.00s user  0.00s system 


time -c run_script.csh` 

... 

real 1m22.38s 
user 0m14.67s 
sys  0m1.06s 
0

निम्नलिखित काम करता है 6 हैं:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#if ! defined(_POSIX_C_SOURCE) 
# error "_POSIX_C_SOURCE undefined" 
#endif 

#if _POSIX_C_SOURCE < 199309L 
# error "_POSIX_C_SOURCE < 199309L" 
#endif 

int main(int, char**){ 
    struct timespec start, stop; 
    struct timespec stop; 
    if(clock_gettime(CLOCK_MONOTONIC, &start)) goto err_out; 
    if(clock_gettime(CLOCK_MONOTONIC, &stop )) goto err_out; 
    printf("start == {tv_sec: %d, tv_nsec: %d}\n", start.tv_sec, start.tv_nsec); 
    printf("stop == {tv_sec: %d, tv_nsec: %d}\n", stop.tv_sec, stop.tv_nsec); 
    printf("stop.tv_nsec - start.tv_nsec == %d\n", stop.tv_nsec - start.tv_nsec); 
    return EXIT_SUCCESS; 
err_out: 
    perror("clock_gettime"); 
    return EXIT_FAILURE ; 
} 

... हालांकि यह आवश्यकता होती है librt:

$ make dur 
cc  dur.c -o dur 
/tmp/cc1yF58x.o: In function `main': 
dur.c:(.text+0x1c): undefined reference to `clock_gettime' 
dur.c:(.text+0x4e): undefined reference to `clock_gettime' 
collect2: ld returned 1 exit status 
make: *** [dur] Error 1 
$ LDFLAGS="-lrt" make dur 
cc -lrt dur.c -o dur 
$ ./dur 
start == {tv_sec: 206247, tv_nsec: 411717209} 
stop == {tv_sec: 206247, tv_nsec: 411759791} 
stop.tv_nsec - start.tv_nsec == 42582