#include <iostream>
#include <map>
#include <ctime>
struct Base { virtual void foo() {} };
struct A : Base { void foo() {} };
struct B : Base { void foo() {} };
struct C : Base { void foo() {} };
A* protoA = new A; B* protoB = new B; C* protoC = new C;
enum Tag {a, b, c};
std::map<Tag, Base*> protoMap = { {a, protoA}, {b, protoB}, {c, protoC} };
void goo(Base* base) {base->foo();}
void hoo(Tag tag) {protoMap[tag]->foo();}
struct Timer {
const std::clock_t begin;
Timer() : begin (std::clock()) {}
~Timer() {
const std::clock_t end = std::clock();
std::cout << double (end - begin)/CLOCKS_PER_SEC << " seconds." << std::endl;
};
};
int main() {
const long N = 10000000;
{
Timer timer;
for (int i = 0; i < N; i++)
goo(new C); // using vtable
} // 0.445 seconds.
{
Timer timer;
for (int i = 0; i < N; i++)
hoo(c); // using map
} // 0.605 seconds.
std::cin.get();
}
但我的測試只使用三個派生類,我不知道如何定義數千個派生類來進行正確的基準測試。有沒有人知道答案已經這樣,我不必考慮如何運行更好的測試?哪個執行速度更快?用N個派生類型進行vtable查找,或者用N個元素查找std :: map查找?
我現在處於一種可以輕鬆使用地圖的情況,但試圖用vtable查找來提高性能時,需要重新設計我已有的許多東西(向類中添加一個新的數據成員,定義一個新的構造函數,實現訪問者模式,等等......)。
你正在比較蘋果和橘子;這個「標籤」方法如何在現實的多態場景中提供幫助? – 2014-11-09 01:14:15
@Oliver。因爲我處於可以輕鬆使用地圖的情況,但是嘗試通過vtable查找來提高性能,需要重新設計我已有的許多內容(向類添加新的數據成員,定義新的構造函數,實現訪問者模式等)。 – prestokeys 2014-11-09 01:17:01
我認爲vtable速度更快,並且是唯一正確的路徑,儘管在我的具體情況下我很困難。 – prestokeys 2014-11-09 01:25:37