Jon*_*röm 9 c++ performance dynamic-cast stdstring
...大致相比典型std::string::operator==()?我在下面提供一些更多细节,我不确定它们是否具有任何相关性.复杂性或近似性的答案足够好.谢谢!
详细信息:我将在列表中的for循环中使用它来查找某些特定实例.我估计我的平均继承级别为3.5级.我正在寻找的那个有一个父类,一个祖父母和两个"接口"之上,即用几个抽象类virtual void abc() = 0;.
我正在寻找的那个没有子类.
Cra*_*rks 12
它在很大程度上取决于您的编译器,您的特定类层次结构,硬件,各种因素.您确实需要在特定应用程序中直接测量它.您可以使用rdtsc或(在Windows上)QueryPerformanceCounter来获得相对高精度的计时器.确保数千个dynamic_cast <> s的时间循环或雪橇,因为即使QPC只有¼μs的分辨率.
在我们的应用程序中,dynamic_cast <>的成本约为1微秒,字符串比较约为3ns /字符.
dynamic_cast <>和stricmp()都位于我们的配置文件的顶部,这意味着使用它们的性能成本非常高.(坦率地说,在我们的工作中,将这些函数放在配置文件中如此之高是不可接受的,我不得不重写一堆别人使用它们的代码.)
最好的答案是测量,我的猜测dynamic_cast是比比较除最短的字符串(或者甚至比短字符串)更快.
话虽这么说,试图确定一个对象的类型通常是设计糟糕的标志,根据Liskov的替换原则,你应该只对待对象并使虚拟函数表现正确,而不从外部检查类型.
编辑:重新阅读你的问题之后我会坚持到那里我没有找到一个子课程.
在这种情况下你可以typeid直接使用,我相信它应该比你的任何一个选项更快(虽然在我看来寻找特定类型仍然是代码味道)
#include <iostream>
#include <typeinfo>
struct top {
virtual ~top() {}
};
struct left : top { };
struct right : top { };
int main()
{
left lft;
top &tp = lft;
std::cout << std::boolalpha << (typeid(lft) == typeid(left)) << std::endl;
std::cout << std::boolalpha << (typeid(tp) == typeid(left)) << std::endl;
std::cout << std::boolalpha << (typeid(tp) == typeid(right)) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
真的
是
假的