对于长时间(几小时)要每秒调用100次或更多次的类中的函数,就性能而言,以下哪种方法更好?
每次调用函数时,使用dynamic cast
将var强制转换为所需的类型:
Foo()
{
TypeA* A = dynamic_cast<TypeA>(B);
// do something with A
}
将转换结果缓存到所需类型的变量中,仅在缓存为null时才进行转换,否则使用缓存:
Foo()
{
TypeA* A = GetCachedA();
// do something with A
}
TypeA* GetCachedA()
{
if(CachedA == nullptr)
CachedA = dynamic_cast<TypeA>(B);
return CachedA;
}
这种差异对某些人来说可能是微不足道的,但请记住,这是一个性能至关重要的场景,而每一个性能下降都很重要。
答案 0 :(得分:2)
当我对此进行测试时(公认的是,不是最近),dynamic_cast
足够昂贵,以至于倾向于缓存指针。但这是我在与您不同的情况下在一台过时的机器上进行的测试。
当时,我使用了稍微不同的基本设计。我没有检查空指针,而是使用了一个指向函数的指针(可以使用虚函数...),该指针已初始化为指向执行动态转换的函数,然后保存结果,然后(关键部分)用刚刚返回缓存的指针的函数的地址覆盖了函数指针。
在将指针添加到缓存时,这增加了一些额外的开销,但是在以后的使用中减少了(相当一点)。至少在我的测试中,只要您至少使用指针三次,那便是一次胜利(但是,在这里,您的行驶里程可能并且可能会有所不同)。