ฉันมักจะตั้งคำถามกับตัวเองในเรื่องนี้โดยเฉพาะอย่างยิ่งตั้งแต่เมื่อไม่กี่ปีที่ผ่านมาฉันได้ทำการทดสอบดังกล่าวเปรียบเทียบการกำหนดเวลาของการโทรแบบสมาชิกมาตรฐานกับการโทรเสมือนจริงและรู้สึกโกรธมากเกี่ยวกับผลลัพธ์ในเวลานั้นโดยมีการโทรเสมือนว่างเปล่า ช้ากว่าแบบไม่เสมือน 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;
}
และรู้สึกประหลาดใจมากที่ในความเป็นจริงมันไม่สำคัญเลยอีกต่อไป แม้ว่ามันจะสมเหตุสมผลที่จะอินไลน์ได้เร็วกว่าที่ไม่ใช่เสมือนและมันเร็วกว่าเวอร์ชวล แต่ก็มักจะมาพร้อมกับการโหลดของคอมพิวเตอร์โดยรวมไม่ว่าแคชของคุณจะมีข้อมูลที่จำเป็นหรือไม่ก็ตามและในขณะที่คุณสามารถปรับให้เหมาะสมได้ ที่ระดับแคชฉันคิดว่าผู้พัฒนาคอมไพเลอร์ควรทำสิ่งนี้มากกว่าโดยนักพัฒนาแอปพลิเคชัน