बहु थ्रेडिंग कार्यक्रम का मापने का समय

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

मेरा सवाल है: इस मुद्दे के लिए बेहतर कार्य क्या है? clock_gettime() या एमबी gettimeofday ()? या कुछ और एमबी?

अगर clock_gettime (), तो किस घड़ी के साथ? CLOCK_REALTIME या CLOCK_MONOTONIC?

मैक ओएस एक्स (बर्फ तेंदुए) का उपयोग करना

1

2 उत्तर

यदि आप दीवार घड़ी का समय चाहते हैं, और clock_gettime() उपलब्ध है, तो यह एक अच्छी पसंद है। यदि आप दिन के वास्तविक समय प्राप्त करने के लिए समय के अंतराल को माप रहे हैं, और CLOCK_REALTIME के साथ CLOCK_MONOTONIC के साथ इसका उपयोग करें।

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
जोड़ा

मुझे लगता है कि घड़ी() सभी धागे के बीच कुल सीपीयू उपयोग की गणना करता है, मुझे यह समस्या भी थी ...

दीवार घड़ी की विधि की पसंद व्यक्तिगत वरीयता है। मैं टाइम-टिकटें लेने के लिए एक इनलाइन रैपर फ़ंक्शन का उपयोग करता हूं (2 प्रोसेसिंग के समय में 2 टाइम-स्टैंप का अंतर लें)। मैंने सुविधा के लिए फ़्लोटिंग पॉइंट का उपयोग किया है (इकाइयां सेकंड में हैं, पूर्णांक ओवरफ़्लो के बारे में चिंता करने की ज़रूरत नहीं है)। बहु-थ्रेडिंग के साथ, इतने सारे असीमित घटनाएं हैं कि मेरी राय में यह 1 माइक्रोसॉन्ड के नीचे समय के लिए समझ में नहीं आता है। यह अब तक मेरे लिए बहुत अच्छा काम किया है :)

जो भी आप चुनते हैं, एक रैपर प्रयोग करने का सबसे आसान तरीका है

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

उपयोग:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
जोड़ा