Saya selalu mempertanyakan hal ini pada diri saya sendiri, terutama karena - beberapa tahun yang lalu - Saya juga melakukan tes seperti membandingkan waktu panggilan metode anggota standar dengan yang virtual dan benar-benar marah tentang hasilnya pada waktu itu, memiliki panggilan virtual kosong menjadi 8 kali lebih lambat daripada non-virtual.
Hari ini saya harus memutuskan apakah akan menggunakan fungsi virtual atau tidak untuk mengalokasikan lebih banyak memori di kelas buffer saya, dalam aplikasi yang sangat kritis kinerja, jadi saya googled (dan menemukan Anda), dan pada akhirnya, melakukan tes lagi.
// 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;
}
Dan sangat terkejut bahwa itu - pada kenyataannya - benar-benar tidak penting lagi. Meskipun masuk akal untuk memiliki inline lebih cepat daripada non-virtual, dan mereka lebih cepat daripada virtual, sering terjadi pada beban komputer secara keseluruhan, apakah cache Anda memiliki data yang diperlukan atau tidak, dan sementara Anda mungkin dapat mengoptimalkan pada tingkat cache, saya pikir, bahwa ini harus dilakukan oleh pengembang kompiler lebih dari oleh pengembang aplikasi.