Tôi luôn tự đặt câu hỏi cho mình về điều này, đặc biệt là từ - cách đây vài năm - tôi cũng đã làm một bài kiểm tra như vậy so sánh thời gian của một cuộc gọi phương thức thành viên tiêu chuẩn với một cuộc gọi ảo và thực sự tức giận về kết quả lúc đó, có những cuộc gọi ảo trống rỗng Chậm hơn 8 lần so với phi ảo.
Hôm nay tôi phải quyết định có sử dụng chức năng ảo để phân bổ thêm bộ nhớ trong lớp đệm của mình hay không, trong một ứng dụng quan trọng về hiệu năng, vì vậy tôi đã tìm hiểu (và tìm thấy bạn), và cuối cùng, đã làm lại bài kiểm tra.
// 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;
}
Và thực sự ngạc nhiên rằng nó - thực tế - thực sự không còn quan trọng nữa. Mặc dù nó có ý nghĩa để có các dòng nội tuyến nhanh hơn so với không phải ảo và chúng nhanh hơn ảo, nhưng nó thường liên quan đến tải của máy tính, cho dù bộ nhớ cache của bạn có dữ liệu cần thiết hay không, và trong khi bạn có thể tối ưu hóa ở cấp độ bộ đệm, tôi nghĩ rằng điều này nên được thực hiện bởi các nhà phát triển trình biên dịch hơn là bởi các nhà phát triển ứng dụng.