एसओ पर, प्रदर्शन प्रोफाइलिंग के बारे में कुछ सवाल हैं, लेकिन मुझे पूरी तस्वीर नहीं मिलती है। इसमें बहुत से मुद्दे शामिल हैं और अधिकांश प्रश्न & एक समय में कुछ को अनदेखा करते हैं, या उनके प्रस्तावों को उचित नहीं ठहराते हैं।प्रोफाइलर के बिना सी ++ में कोड की गति का परीक्षण करने का सबसे अच्छा तरीका है, या यह कोशिश करने के लिए समझ में नहीं आता है?
मैं किस बारे में सोच रहा हूं। यदि मेरे पास दो कार्य हैं जो एक ही काम करते हैं, और मैं गति में अंतर के बारे में उत्सुक हूं, तो क्या यह बाहरी उपकरणों के बिना परीक्षण करने के लिए समझ में आता है, टाइमर के साथ, या परीक्षण में संकलित यह परिणाम को प्रभावित करेगा?
मैं यह पूछता हूं क्योंकि यदि यह समझदार है, सी ++ प्रोग्रामर के रूप में, मैं जानना चाहता हूं कि इसे कैसे किया जाना चाहिए, क्योंकि वे बाहरी उपकरणों का उपयोग करने से कहीं अधिक सरल हैं। यदि यह समझ में आता है, तो सभी संभावित नुकसान के साथ आगे बढ़ने दें:
इस उदाहरण पर विचार करें।
#include <algorithm>
#include <ctime>
#include <iostream>
typedef unsigned char byte;
inline
void
swapBytes(void* in, size_t n)
{
for(size_t lo=0, hi=n-1; hi>lo; ++lo, --hi)
in[lo] ^= in[hi]
, in[hi] ^= in[lo]
, in[lo] ^= in[hi] ;
}
int
main()
{
byte arr[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
const int iterations = 100000000;
clock_t begin = clock();
for(int i=iterations; i!=0; --i)
swapBytes(arr, 8);
clock_t middle = clock();
for(int i=iterations; i!=0; --i)
std::reverse(arr, arr+8);
clock_t end = clock();
double secSwap = (double) (middle-begin)/CLOCKS_PER_SEC;
double secReve = (double) (end-middle )/CLOCKS_PER_SEC;
std::cout << "swapBytes, for: " << iterations << " times takes: " << middle-begin
<< " clock ticks, which is: " << secSwap << "sec." << std::endl;
std::cout << "std::reverse, for: " << iterations << " times takes: " << end-middle
<< " clock ticks, which is: " << secReve << "sec." << std::endl;
std::cin.get();
return 0;
}
// Output:
// Release:
// swapBytes, for: 100000000 times takes: 3000 clock ticks, which is: 3sec.
// std::reverse, for: 100000000 times takes: 1437 clock ticks, which is: 1.437sec.
// Debug:
// swapBytes, for: 10000000 times takes: 1781 clock ticks, which is: 1.781sec.
// std::reverse, for: 10000000 times takes: 12781 clock ticks, which is: 12.781sec.
मुद्दों:: निम्नलिखित कोड ही बात कर के 2 तरीकों से पता चलता
- उपयोग करने के लिए और कैसे CPU समय वास्तव में प्रश्न के अंतर्गत कोड से भस्म हो टाइमर है?
- कंपाइलर अनुकूलन के प्रभाव क्या हैं (चूंकि ये फ़ंक्शंस केवल बाइट्स को स्वैप करते हैं, सबसे कुशल बात स्पष्ट रूप से कुछ भी नहीं करने के लिए है)?
- यहां प्रस्तुत परिणामों को ध्यान में रखते हुए, क्या आपको लगता है कि वे सटीक हैं (मैं आपको आश्वस्त कर सकता हूं कि एकाधिक रन बहुत समान परिणाम देते हैं)? यदि हां, तो क्या आप कस्टम फ़ंक्शन की सादगी पर विचार कर सकते हैं कि std :: रिवर्स इतनी तेजी से कैसे हो सकता है। मेरे पास vC++ संस्करण से स्रोत कोड नहीं है जिसे मैंने इस परीक्षण के लिए उपयोग किया था, लेकिन जीएनयू से here is the implementation। यह iter_swap फ़ंक्शन पर उबालता है, जो मेरे लिए पूरी तरह से समझ में नहीं आता है। क्या यह भी कस्टम कार्य के रूप में तेज़ी से दो बार दौड़ने की उम्मीद की जाएगी, और यदि हां, तो क्यों?
contemplations:
ऐसा लगता है दो उच्च परिशुद्धता टाइमर दिया जा रहा है: clock() और QueryPerformanceCounter (खिड़कियों पर)। जाहिर है, हम अपने कोड के सीपीयू समय को मापना चाहते हैं, वास्तविक समय नहीं, लेकिन जहां तक मैं समझता हूं, ये कार्य उस कार्यक्षमता को नहीं देते हैं, इसलिए सिस्टम पर अन्य प्रक्रिया मापों में हस्तक्षेप करेगी। This page gnu c लाइब्रेरी पर विरोधाभास प्रतीत होता है, लेकिन जब मैं vC++ में ब्रेकपॉइंट डालता हूं, तो डीबग प्रक्रिया को निलंबित कर दिया गया है, भले ही इसे निलंबित कर दिया गया हो (मैंने gnu के तहत परीक्षण नहीं किया है)। क्या मैं इसके लिए वैकल्पिक काउंटर खो रहा हूं, या इसके लिए हमें कम से कम विशेष पुस्तकालयों या कक्षाओं की आवश्यकता है? यदि नहीं, तो इस उदाहरण में घड़ी काफी अच्छी है या क्या QueryPerformanceCounter का उपयोग करने का कोई कारण होगा?
डिबगिंग, असंतुलन और प्रोफाइलिंग प्रोफाइल के बिना हम निश्चित रूप से क्या जान सकते हैं? क्या वास्तव में कुछ भी हो रहा है? क्या फंक्शन कॉल रेखांकित किया जा रहा है या नहीं? डीबगर में जांच करते समय, बाइट वास्तव में स्वैप हो जाते हैं, लेकिन परीक्षण से तुलना में, मैं सिद्धांत से क्यों जानना चाहता हूं।
किसी भी दिशा के लिए धन्यवाद।
अद्यतन
धन्यवाद swapBytes समारोह अब भी जितनी जल्दी संभव std :: रिवर्स चलाता है एक hinttojas से करने के लिए। मैं यह महसूस करने में नाकाम रहा था कि बाइट के मामले में अस्थायी प्रति केवल एक रजिस्टर होना चाहिए, और इस प्रकार यह बहुत तेज़ है। लालित्य आपको अंधेरा कर सकता है।
inline
void
swapBytes(byte* in, size_t n)
{
byte t;
for(int i=0; i<7-i; ++i)
{
t = in[i];
in[i] = in[7-i];
in[7-i] = t;
}
}
धन्यवाद एक tipChrisW से करने के लिए मैं ने पाया है कि खिड़कियों पर आप वास्तविक CPU समय एक से भस्म प्राप्त कर सकते हैं (पढ़ें: अपने) प्रक्रिया गर्त Windows Management Instrumentation। यह निश्चित रूप से उच्च परिशुद्धता काउंटर की तुलना में अधिक दिलचस्प लग रहा है।
आप किस ओएस के बारे में पूछ रहे हैं? वापस जब मैंने टाइम कोड लिखा था, तो विभिन्न ओएस के पास सही घड़ी के लिए अलग-अलग एपीआई कॉल थे। –
मैं विंडोजएक्सपी पर परीक्षण कर रहा हूं, लेकिन प्रोफेसर के साथ पहली बार प्रयास करने के बाद, अन्य ओएस के – nus
वर्थर के बिना प्रयास करने के लिए वर्थ करना भी उतना ही दिलचस्प होगा। –