2010-01-30 9 views
5

मैं जानना चाहता था कि एक ही बूस्ट :: फ़ंक्शन कॉल की तुलना में एकल-विरासत वर्चुअल फ़ंक्शन कॉल कितनी तेज़ है। क्या वे प्रदर्शन में लगभग समान हैं या बूस्ट :: फंक्शन धीमा है?सी ++ आभासी फ़ंक्शन कॉल बनाम बूस्ट :: फ़ंक्शन कॉल speedwise

मुझे पता है कि प्रदर्शन मामले से भिन्न हो सकता है, लेकिन, सामान्य नियम के रूप में, जो तेज़ है, और यह कितनी बड़ी डिग्री है?

धन्यवाद, गुइलहर्मे

- संपादित

KennyTM के परीक्षण मेरे लिए पर्याप्त रूप से कायल था। boost :: फ़ंक्शन मेरे अपने उद्देश्यों के लिए vcall से बहुत धीमा प्रतीत नहीं होता है। धन्यवाद।

+1

भी, यह एक माइक्रो-अनुकूलन है ... –

उत्तर

7

एक बहुत ही विशेष मामले के रूप में, एक खाली फ़ंक्शन 10 बार कॉल करने पर विचार करें।


कोड एक:

struct X { 
      virtual ~X() {} 
     virtual void do_x() {}; 
}; 
struct Y : public X {}; // for the paranoid. 

int main() { 
     Y* x = new Y; 
     for (int i = 100000000; i >= 0; -- i) 
       x->do_x(); 
     delete x; 
     return 0; 
} 

कोड बी: (बढ़ावा 1.41 के साथ):

#include <boost/function.hpp> 

struct X { 
    void do_x() {}; 
}; 

int main() { 
    X* x = new X; 
    boost::function<void (X*)> f; 
    f = &X::do_x; 
    for (int i = 100000000; i >= 0; -- i) 
     f(x); 
    delete x; 
    return 0; 
} 

g++ -O3 साथ संकलित, तो time के साथ समय,

  • कोड एक 0.30 सेकंड लेता है।
  • कोड बी 0.54 सेकंड लेता है।

विधानसभा कोड का निरीक्षण करने से ऐसा लगता है कि सुस्ती अपवाद के कारण और संभावना से निपटने हो सकता है और उस f शून्य हो सकता है। लेकिन एक boost::function कॉल की कीमत केवल 2.4 नैनोसेकंड (मेरी 2 गीगाहर्ट्ज मशीन पर) है, तो आपके do_x() में वास्तविक कोड यह बहुत अधिक छाया कर सकता है। मैं कहूंगा, boost::function से बचने का कोई कारण नहीं है।

+1

और ए के मामले में एकल विरासत कहां है? ;) –

+1

@gf: आप जानते हैं कि vtable कैसे काम करता है? विरासत कोई फर्क नहीं पड़ता क्योंकि पूरे vtable की प्रतिलिपि बनाई गई है। – kennytm

+3

हालांकि इस तरह का एक त्वरित परीक्षण वास्तव में बहुत उपयोगी है, यह केवल आपको बताता है कि कोड विशिष्ट परिस्थितियों (परीक्षण केस, कंपाइलर, कंपाइलर सेटिंग्स, प्लेटफ़ॉर्म इत्यादि) के तहत प्रदर्शन-वार कैसे व्यवहार करता है। यह आपके परिणाम से इनकार नहीं करना है, मैं केवल एक परीक्षण मामले से सामान्यीकरण करते समय सावधान रहना याद कर रहा हूं। – sbi