मैंने हमेशा अपने आप से यह सवाल किया, खासकर जब से - कुछ साल पहले - मैंने भी ऐसा परीक्षण किया था जिसमें एक मानक सदस्य विधि कॉल के समय की तुलना एक आभासी एक के साथ की गई थी और वास्तव में उस समय के परिणामों के बारे में गुस्सा था, खाली आभासी कॉल होने के कारण गैर-आभासी की तुलना में 8 गुना धीमा।
आज मुझे यह तय करना था कि मैं अपने बफर क्लास में अधिक मेमोरी आवंटित करने के लिए वर्चुअल फ़ंक्शन का उपयोग करूं या नहीं, बहुत ही महत्वपूर्ण आलोचनात्मक ऐप में, इसलिए मैंने googled (और आपको पाया), और अंत में, फिर से परीक्षण किया।
// g++ -std=c++0x -o perf perf.cpp -lrt
#include <typeinfo> // typeid
#include <cstdio> // printf
#include <cstdlib> // atoll
#include <ctime> // clock_gettime
struct Virtual { virtual int call() { return 42; } };
struct Inline { inline int call() { return 42; } };
struct Normal { int call(); };
int Normal::call() { return 42; }
template<typename T>
void test(unsigned long long count) {
std::printf("Timing function calls of '%s' %llu times ...\n", typeid(T).name(), count);
timespec t0, t1;
clock_gettime(CLOCK_REALTIME, &t0);
T test;
while (count--) test.call();
clock_gettime(CLOCK_REALTIME, &t1);
t1.tv_sec -= t0.tv_sec;
t1.tv_nsec = t1.tv_nsec > t0.tv_nsec
? t1.tv_nsec - t0.tv_nsec
: 1000000000lu - t0.tv_nsec;
std::printf(" -- result: %d sec %ld nsec\n", t1.tv_sec, t1.tv_nsec);
}
template<typename T, typename Ua, typename... Un>
void test(unsigned long long count) {
test<T>(count);
test<Ua, Un...>(count);
}
int main(int argc, const char* argv[]) {
test<Inline, Normal, Virtual>(argc == 2 ? atoll(argv[1]) : 10000000000llu);
return 0;
}
और वास्तव में आश्चर्यचकित था कि यह - वास्तव में - वास्तव में अब कोई फर्क नहीं पड़ता। हालांकि गैर-आभासी लोगों की तुलना में तेजी से इनलाइन होने का मतलब है, और वे तेजी से वर्चुअल हो रहे हैं, यह अक्सर कंप्यूटर के भार के लिए आता है, चाहे आपके कैश में आवश्यक डेटा हो या नहीं, और हो सकता है कि आप अनुकूलन करने में सक्षम हों कैश-स्तर पर, मुझे लगता है, कि यह कंपाइल डेवलपर्स द्वारा एप्लिकेशन देवों से अधिक किया जाना चाहिए।