আমি সর্বদা নিজেকে প্রশ্নবিদ্ধ করেছি, বিশেষত যেহেতু - বেশ কয়েক বছর আগে - আমি একটি ভার্চুয়াল সাথে একটি স্ট্যান্ডার্ড সদস্য পদ্ধতি কলের সময়ের সাথে তুলনা করে এমন পরীক্ষাও করেছিলাম এবং ফলাফলটি সম্পর্কে সত্যিই রাগ ছিলাম, খালি ভার্চুয়াল কল থাকায় অ-ভার্চুয়ালগুলির চেয়ে 8 গুণ ধীর।
আজ আমার সিদ্ধান্ত নিতে হয়েছিল আমার বাফার ক্লাসে আরও মেমরি বরাদ্দ করার জন্য ভার্চুয়াল ফাংশনটি ব্যবহার করতে হবে কি না, খুব কার্য সম্পাদনের সমালোচনামূলক অ্যাপে, তাই আমি গুগল করেছিলাম (এবং আপনাকে খুঁজে পেয়েছি) এবং শেষ পর্যন্ত আবার পরীক্ষাও করেছিলাম।
// 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;
}
এবং সত্যই অবাক হয়েছিল যে এটি - সত্যই - সত্যিকার অর্থে এখন মোটেই গুরুত্বপূর্ণ নয়। যদিও এটি অ-ভার্চুয়ালগুলির চেয়ে দ্রুততর ইনলাইনগুলি বোধগম্য করে তোলে এবং সেগুলি ভার্চুয়ালগুলির চেয়ে দ্রুততর হয়, আপনার ক্যাশে প্রয়োজনীয় ডেটা আছে কি না এবং সামগ্রিকভাবে কম্পিউটারের বোঝা আসে এবং আপনি যখন অনুকূলিত করতে সক্ষম হন তবে ক্যাশে-পর্যায়ে, আমি মনে করি, এটি অ্যাপ্লিকেশন ডিএইচএসের চেয়ে সংকলক বিকাশকারীদের দ্বারা আরও করা উচিত।