2008-09-04 10 views
14

सबसे अच्छा तरीका है सी ++ में भूमि के ऊपर/प्रदर्शन से निपटने के अपवाद को मापने के लिए क्या है मापने?अपवाद C++ में भूमि के ऊपर से निपटने

स्टैंडअलोन कोड नमूने दे।

मैं माइक्रोसॉफ्ट विजुअल C++ 2008 और जीसीसी लक्षित कर रहा हूँ।

  1. ओवरहेड जब कोई ट्राई/कैच ब्लॉक
  2. ओवरहेड जब वहाँ ट्राई/कैच ब्लॉक हैं, लेकिन अपवाद फेंक दिया नहीं कर रहे हैं
  3. ओवरहेड जब कर रहे हैं:

    मैं निम्नलिखित मामलों से परिणाम प्राप्त करने की जरूरत है अपवादों को

उत्तर

9

एक सुझाव के रूप में: अपवादों को फेंकने पर ओवरहेड के साथ बहुत अधिक परेशान न करें। अपवाद हैंडलिंग कार्यान्वयन आमतौर पर तेजी से फेंकने और धीमी गति से नहीं फेंकते हैं। यह ठीक है क्योंकि उन मामलों में, असाधारण, असाधारण हैं।

कार्ल

7

यहां मापने वाला कोड है जिसके साथ मैं आया हूं। क्या आप इसके साथ कोई समस्या देखते हैं? लिनक्स और विंडोज पर

निर्माण अब तक, संकलन के साथ:

g++ exception_handling.cpp -o exception_handling [ -O2 ] 

या उदाहरण Visual C++ Express के लिए। MSVC में

g++ exception_handling.cpp -o exception_handling [ -O2 ] -fno-exceptions -DNO_EXCEPTIONS 

या इसी तरह की सेटिंग:

आधार मामले ("अपवाद समर्थन पूरी तरह से हटा दिया भाषा") प्राप्त करने के लिए, का उपयोग करें।

कुछ प्रारंभिक परिणामों here। वे शायद क्योंकि मशीन लोड बदलती के सभी सस्ती हैं, लेकिन वे रिश्तेदार अपवाद हैंडलिंग भूमि के ऊपर के बारे में कुछ विचार दे कर। (कार्यकारी सारांश: कोई नहीं या थोड़ा जब कोई अपवाद नहीं फेंक दिया जाता है, बहुत बड़ा है जब वे वास्तव में फेंक दिया जाता है।)

#include <stdio.h> 

// Timer code 

#if defined(__linux__) 
#include <sys/time.h> 
#include <time.h> 

double time() 
{ 
    timeval tv; 
    gettimeofday(&tv, 0); 
    return 1.0 * tv.tv_sec + 0.000001 * tv.tv_usec; 
} 
#elif defined(_WIN32) 
#include <windows.h> 

double get_performance_frequency() 
{ 
    unsigned _int64 frequency; 
    QueryPerformanceFrequency((LARGE_INTEGER*) &frequency); // just assume it works 
    return double(frequency); 
} 

double performance_frequency = get_performance_frequency(); 

double time() 
{ 
    unsigned _int64 counter; 
    QueryPerformanceCounter((LARGE_INTEGER*) &counter); 
    return double(counter)/performance_frequency; 
} 
#else 
# error time() not implemented for your platform 
#endif 

// How many times to repeat the whole test 
const int repeats = 10; 

// How many times to iterate one case 
const int times = 1000000; 

// Trick optimizer to not remove code 
int result = 0; 



// Case 1. No exception thrown nor handled. 

void do_something() 
{ 
    ++result; 
} 

void case1() 
{ 
    do_something(); 
} 



// Case 2. No exception thrown, but handler installed 

#ifndef NO_EXCEPTIONS 
void do_something_else() 
{ 
    --result; 
} 

void case2() 
{ 
    try 
    { 
     do_something(); 
    } 
    catch (int exception) 
    { 
     do_something_else(); 
    } 
} 



// Case 3. Exception thrown and caught 

void do_something_and_throw() 
{ 
    throw ++result; 
} 

void case3() 
{ 
    try 
    { 
     do_something_and_throw(); 
    } 
    catch (int exception) 
    { 
     result = exception; 
    } 
} 
#endif // !NO_EXCEPTIONS 

void (*tests[])() = 
{ 
    case1, 
#ifndef NO_EXCEPTIONS 
    case2, 
    case3 
#endif // !NO_EXCEPTIONS 
}; 

int main() 
{ 
#ifdef NO_EXCEPTIONS 
    printf("case0\n"); 
#else 
    printf("case1\tcase2\tcase3\n"); 
#endif 
    for (int repeat = 0; repeat < repeats; ++repeat) 
    { 
     for (int test = 0; test < sizeof(tests)/sizeof(tests[0]); ++test) 
     { 
      double start = time(); 

      for (int i = 0; i < times; ++i) 
       tests[test](); 

      double end = time(); 

      printf("%f\t", (end - start) * 1000000.0/times); 
     } 
     printf("\n"); 
    } 

    return result; // optimizer is happy - we produce a result 
} 
+1

मुझे आपके प्लेटफ़ॉर्म पर परिणामों में दिलचस्पी होगी ... –

+1

क्या आपने कोई परीक्षण करने का प्रयास किया था जहां आप कोई अपवाद प्राप्त करेंगे (पकड़ें (...))। यह सिर्फ एक अपवाद वर्ग को पकड़ने से अलग हो सकता है ... –

2

meassure है कि कोड में कोई वास्तव में अच्छा तरीका नहीं है। आपको एक प्रोफाइलर का उपयोग करने की आवश्यकता होगी।

यह आपको सीधे नहीं दिखाएगा कि अपवाद हैंडलिंग के साथ कितना समय व्यतीत किया गया है लेकिन थोड़ी सी शोध के साथ आप पता लगाएंगे कि कौन सी रनटाइम विधियां अपवादों से निपटती हैं (उदाहरण के लिए वीसी ++। नेट यह __cxx_exc है .. ।])।

अपना समय जोड़ें और आपके ऊपर का ओवरहेड है। हमारी परियोजना में हमने इंटेल से vTunes का उपयोग किया जो विजुअल सी ++ और जीसीसी दोनों के साथ काम करता है।

संपादित करें: ठीक है, अगर आपको केवल एक सामान्य संख्या की आवश्यकता है जो काम कर सके। सोचा था कि आपके पास प्रोफ़ाइल के लिए एक वास्तविक एप्लिकेशन था जहां आप अपवादों को बंद नहीं कर सकते हैं।

34

draft Technical Report on C++ Performance का सेक्शन 5.4 पूरी तरह से अपवादों के ऊपरी हिस्से में समर्पित है।

+3

लिंक में मृत होने पर, उत्तर में प्रासंगिक सामग्री को उद्धृत करके इसे बेहतर किया जा सकता है। – OMGtechy

2

अपवाद हैंडलिंग प्रदर्शन पर एक और नोट: सरल परीक्षण खाते में कैशिंग नहीं लेते हैं। कोशिश कोड और पकड़ने के कोड दोनों इतना छोटा है कि सब कुछ शिक्षा और डेटा संचय में फिट बैठता है कर रहे हैं।लेकिन कंपाइलर्स कैच-कोड को ट्राई-कोड से दूर ले जाने का प्रयास कर सकते हैं, जो सामान्य रूप से कैश में रखने के लिए कोड की मात्रा को कम करता है, इस प्रकार प्रदर्शन को बढ़ाता है।

आप पारंपरिक सी शैली वापसी-मूल्य की जाँच करने के लिए अपवाद संचालन की तुलना करें, यह कैशिंग प्रभाव को ध्यान में रूप में अच्छी तरह (प्रश्न आमतौर पर विचार विमर्श में नजरअंदाज कर दिया है) लिया जाना चाहिए।

कार्ल

0

जवाब क्या सफाई थ्रो के परिणामस्वरूप होना होता है पर निर्भर नहीं होगा? यदि एक उत्तेजना फेंक दी जाती है जो पूरे सामानों को ढेर से बाहर निकलने का कारण बनती है, तो वह उपरि में जोड़ देगा।

दूसरे शब्दों में, मैं अगर वहाँ 3 प्रश्न कोड की बारीकियों से स्वतंत्र है कि करने के लिए एक एक जवाब है यकीन नहीं है।

+0

अच्छा बिंदु, और मुझे आश्चर्य है कि बिना किसी अपवाद के कोड किए गए संस्करण में उन ऑब्जेक्ट्स को नष्ट करने के लिए कितने परीक्षण खाते हैं, जहां यह अधिक दिनचर्या में फैल गया है। –

3

Kevin Frei अपने भाषण में अपवाद हैंडलिंग प्रदर्शन लागत के बारे में वार्ता "The Cost of C++ Exception Handling on Windows"। (के तहत "सारांश & निष्कर्ष" वहाँ एक सूची आइटम है कि कहते हैं, "हमेशा औसत दर्जे का नहीं [अपवाद हैंडलिंग प्रदर्शन लागत है]"। है) पर कैसे जी ++ अपवाद हैंडल

0

पूर्ण विवरण here दिखाया गया है। यह इसे इटेनियम आर्किटेक्चर के रूप में वर्णित करता है, हालांकि उपयोग की जाने वाली सामान्य तकनीकें समान हैं। यह आपको समय के संदर्भ में सटीक ओवरहेड नहीं बताएगा, हालांकि आप यह समझ सकते हैं कि किसी न किसी कोड ओवरहेड क्या होगा।

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