If, 您需要速度,考虑在物体中填入“类型(识别)”号,并用开关声明选择特定类型的代码。 这样做可以避免完全使用间接费用,而只是在当地跳跃。 你赢得的快要快于此。 一种成本(从可维持性、重复依赖性等角度)是强迫(转换)特定功能的本地化。
IMPLEMENTATION
#include <iostream>
#include <vector>
// virtual dispatch model...
struct Base
{
virtual int f() const { return 1; }
};
struct Derived : Base
{
virtual int f() const { return 2; }
};
// alternative: member variable encodes runtime type...
struct Type
{
Type(int type) : type_(type) { }
int type_;
};
struct A : Type
{
A() : Type(1) { }
int f() const { return 1; }
};
struct B : Type
{
B() : Type(2) { }
int f() const { return 2; }
};
struct Timer
{
Timer() { clock_gettime(CLOCK_MONOTONIC, &from); }
struct timespec from;
double elapsed() const
{
struct timespec to;
clock_gettime(CLOCK_MONOTONIC, &to);
return to.tv_sec - from.tv_sec + 1E-9 * (to.tv_nsec - from.tv_nsec);
}
};
int main(int argc)
{
for (int j = 0; j < 3; ++j)
{
typedef std::vector<Base*> V;
V v;
for (int i = 0; i < 1000; ++i)
v.push_back(i % 2 ? new Base : (Base*)new Derived);
int total = 0;
Timer tv;
for (int i = 0; i < 100000; ++i)
for (V::const_iterator i = v.begin(); i != v.end(); ++i)
total += (*i)->f();
double tve = tv.elapsed();
std::cout << "virtual dispatch: " << total << << tve <<
;
// ----------------------------
typedef std::vector<Type*> W;
W w;
for (int i = 0; i < 1000; ++i)
w.push_back(i % 2 ? (Type*)new A : (Type*)new B);
total = 0;
Timer tw;
for (int i = 0; i < 100000; ++i)
for (W::const_iterator i = w.begin(); i != w.end(); ++i)
{
if ((*i)->type_ == 1)
total += ((A*)(*i))->f();
else
total += ((B*)(*i))->f();
}
double twe = tw.elapsed();
std::cout << "switched: " << total << << twe <<
;
// ----------------------------
total = 0;
Timer tw2;
for (int i = 0; i < 100000; ++i)
for (W::const_iterator i = w.begin(); i != w.end(); ++i)
total += (*i)->type_;
double tw2e = tw2.elapsed();
std::cout << "overheads: " << total << << tw2e <<
;
}
}
www.un.org/Depts/DGACM/index_french.htm
关于我的含水层系统:
~/dev g++ -O2 -o vdt vdt.cc -lrt
~/dev ./vdt
virtual dispatch: 150000000 1.28025
switched: 150000000 0.344314
overhead: 150000000 0.229018
virtual dispatch: 150000000 1.285
switched: 150000000 0.345367
overhead: 150000000 0.231051
virtual dispatch: 150000000 1.28969
switched: 150000000 0.345876
overhead: 150000000 0.230726
这表明,直线型号位数方法大约为(1.28-0.23)/(0.344 - 0.23)=9.2倍。 当然,这一系统的具体特征是测试/汇编旗帜和册;版本等,但一般是指示性的。
www.un.org/Depts/DGACM/index_spanish.htm 评论
必须指出,虽然虚拟功能称为间接费用是很少重要的,而只是用于所谓的三维功能(如采集器和设计器)。 即便如此,你也能够提供单一功能,以便一劳永逸地获得和确定全部物品,从而尽量减少成本。 人们对虚拟发送感到担忧的程度太大,在寻找宽松的替代品之前,情况说明也是如此。 他们的主要问题是,他们履行一条外线职能,尽管他们也使所执行的法典失去地方性,从而改变了海滩利用模式(更好或(更经常)更糟)。