Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ dynamic_cast的速度有多快<&燃气轮机;_C++_Performance_Stdstring_Dynamic Cast - Fatal编程技术网

C++ dynamic_cast的速度有多快<&燃气轮机;

C++ dynamic_cast的速度有多快<&燃气轮机;,c++,performance,stdstring,dynamic-cast,C++,Performance,Stdstring,Dynamic Cast,。。。与典型的std::string::operator==()近似比较?我在下面给出了更多的细节,我不确定它们是否相关。用复杂或近似的答案就足够了。谢谢 详细信息:我将在列表上的for循环中使用它来查找一些特定实例。我估计我的平均继承水平为3.5个类。我正在寻找的一个类有一个父类、一个祖辈类和两个以上的“接口”,即用两个virtualvoid abc()=0抽象类 我要找的没有子类。最好的答案是测量,我猜动态\u cast比比较最短字符串(甚至比短字符串)以外的任何字符串都要快 这就是说,试图

。。。与典型的
std::string::operator==()
近似比较?我在下面给出了更多的细节,我不确定它们是否相关。用复杂或近似的答案就足够了。谢谢

详细信息:我将在列表上的for循环中使用它来查找一些特定实例。我估计我的平均继承水平为3.5个类。我正在寻找的一个类有一个父类、一个祖辈类和两个以上的“接口”,即用两个
virtualvoid abc()=0抽象类


我要找的没有子类。

最好的答案是测量,我猜
动态\u cast
比比较最短字符串(甚至比短字符串)以外的任何字符串都要快

这就是说,试图确定对象的类型通常是设计不好的标志,根据这一点,您只需对对象一视同仁,让虚拟函数以正确的方式运行,而无需从外部检查类型


编辑:重读你的问题后,我会坚持认为我要找的问题没有子类。 在这种情况下,您可以直接使用
typeid
,我相信它应该比您的任何一个选项都快(尽管在我看来,寻找特定类型仍然是一种代码味道)

#包括
#包括
结构顶部{
虚拟~top(){}
};
结构左:顶部{};
右结构:顶部{};
int main()
{
左lft;
top&tp=lft;

std::cout这在很大程度上取决于编译器、特定的类层次结构、硬件以及各种因素。您确实需要在特定的应用程序中直接测量它。您可以使用或(在Windows上)为了获得一个相对高精度的计时器,请确保对数千个动态_投射的循环或底座进行计时,因为即使只有¼μs的分辨率

在我们的应用程序中,动态_cast大约需要1微秒,字符串比较大约需要3ns/个字符


dynamic_cast和stricmp()都位于我们的概要文件的顶部,这意味着使用它们的性能成本是巨大的(坦率地说,在我们的工作中,这些函数在概要文件中占据如此高的位置是不可接受的,我不得不去重写一些其他人使用它们的代码。)

-1如前所述,想要比较
动态播放
标准::字符串::运算符==
,这个问题是没有意义的。如果去掉这种愚蠢,那么“有多快?”的答案只是一个词“测量”@Alf,如果OP面临的选项是执行
动态转换
或比较类型
字符串
(或者
typeid.name
或者用户编写的虚拟函数)这个问题可能有道理。@Alf:这个问题对我来说很有意义。Crashworks的测量结果表明存在显著差异,我认为这是非常普遍的。这节省了我的时间(编码而不是测量).在抱怨和高效之间,你选择了一个愚蠢的选择。哇。
dynamic_-cast
比字符比较慢三个数量级吗?这太奇怪了。编辑虽然没有那么奇怪,因为
dynamic_-cast
可能需要遍历内存中的树(这意味着随机访问和多个缓存未命中)虽然字符串比较可以在缓存内存上运行。@KonradRudolph我想我可以重新运行计时并将它们发布到我的博客上。我上次运行它们是在几年前。而且,我们的类层次结构是巨大的。动态转换的成本随着子代和祖先之间继承的数量而增加。@JonasByström谢谢,但是我的建议是,你真的应该自己测量一下——我发现动态_cast的计时会因类树的大小、使用MSVC还是GCC等等而有很大的不同。你的应用程序的情况可能不同,设置和运行一个简单的计时测试应该只需要半小时。@Crashworks可能会这样做我要花更长的时间,因为我要移植到四个平台上——谢谢,但不用谢。即使我的动态演员比你的快50倍(我觉得不太可能)我认为这是一个很自然的结论:C++ BuuuTin几乎不可能在任何一个平台上更快或更高,更不用说在所有四个平台上了。@ JONASBYSTR OM的差异可能是惊人的大。1MS/3NS的比例是在我怀疑的PowerPC平台上的MSVC上。GCC在另一个PPC平台上。rm接近500ns/3ns。在x86 MSVC上,对于小类层次结构和频繁命中(但对于深层层次结构上的未命中,情况更糟),dynamic_cast与四个strcmp处于对等状态。对于另一个x86平台,在GCC上,strcmp()比dynamic_cast更糟糕,因为GCC的字符串比较实现非常差。这个特殊的东西对有序/无序的硬件差异非常敏感。我要求不必测量,代码是可移植的,也不需要精确性。我猜@Crashworks的测量值基本上是通用的。你的第二个段落并没有给这个问题增加任何价值。你读过Crashwork的回答和后续评论吗?他说:“我发现动态_cast的时间安排因类树的大小、使用MSVC还是GCC等等而有很大的不同。”换句话说,除了泛型之外,我添加了另一个解决方案,它可能比您的两个选项都快。
#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; 
}