dynamic_cast<>的速度有多快

时间:2012-03-19 21:21:21

标签: c++ performance stdstring dynamic-cast

...大致与典型std::string::operator==()相比较?我在下面提供一些更多细节,我不确定它们是否具有任何相关性。复杂性或近似性的答案足够好。谢谢!

详细信息:我将在列表中的for循环中使用它来查找某些特定实例。我估计我的平均继承级别为3.5级。我正在寻找的那个有一个父类,一个祖父母和两个“接口”之上,即用几个virtual void abc() = 0;抽象类。

我要找的那个没有子类。

2 个答案:

答案 0 :(得分:12)

这在很大程度上取决于您的编译器,您的特定类层次结构,硬件,各种因素。您确实需要在特定应用程序中直接测量。您可以使用rdtsc或(在Windows上)QueryPerformanceCounter来获得相对高精度的计时器。确保数千个dynamic_cast<>的时间循环或雪橇,因为即使QPC只有¼μs的分辨率。

在我们的应用中,一个dynamic_cast<>成本约为1微秒,字符串比较约为3ns /字符。

dynamic_cast<>和stricmp()位于我们的配置文件的顶部,这意味着使用它们的性能成本非常高。 (坦率地说,在我们的工作中,让这些功能在配置文件中如此之高是不可接受的,我不得不重写一堆使用它们的其他人的代码。)

答案 1 :(得分:6)

最好的答案是衡量,我的猜测是dynamic_cast比比较除最短的字符串(或者甚至比短字符串)更快。

话虽这么说,试图确定一个对象的类型通常是设计糟糕的标志,根据Liskov's substitution principle你应该只对待对象并使虚拟函数表现正确而不检查从外面打字。


编辑:在重新阅读您的问题之后,我会坚持我将要寻找的那个没有子类。 在这种情况下,您可以直接使用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; 
}

<强>输出:

  


  真正
  假的