gpt4 book ai didi

c++ - dynamic_cast 的性能?

转载 作者:IT老高 更新时间:2023-10-28 12:29:36 30 4
gpt4 key购买 nike

阅读问题前:
这个问题不是关于使用 dynamic_cast 有多大用处。它只是关于它的性能。

我最近开发了一个经常使用 dynamic_cast 的设计。
在与同事讨论时,几乎每个人都说不应该使用 dynamic_cast,因为它的性能很差(这些同事背景不同,在某些情况下彼此不认识。我我在一家大公司工作)

我决定测试这种方法的性能,而不是仅仅相信它们。

使用了以下代码:

ptime firstValue( microsec_clock::local_time() );

ChildObject* castedObject = dynamic_cast<ChildObject*>(parentObject);

ptime secondValue( microsec_clock::local_time() );
time_duration diff = secondValue - firstValue;
std::cout << "Cast1 lasts:\t" << diff.fractional_seconds() << " microsec" << std::endl;

以上代码使用 Linux 上 boost::date_time 中的方法来获取可用值。
我在一次执行中完成了 3 个 dynamic_cast,测量它们的代码是相同的。

1次执行结果如下:
Cast1 持续时间:74 微秒
Cast2 持续时间:2 微秒
Cast3 持续时间:1 微秒

第一次施法总是花费 74-111 微秒,同一执行中的以下施法花费 1-3 微秒。

最后我的问题是:
dynamic_cast 真的表现不佳吗?
根据测试结果它不是。我的测试代码正确吗?
为什么这么多开发人员认为如果不是这样就很慢?

最佳答案

首先,您需要衡量的不仅仅是几次迭代的性能,因为您的结果将取决于计时器的分辨率。尝试例如100 万+,以建立具有代表性的图片。此外,除非您将其与某物进行比较,即执行等效但没有动态转换,否则此结果毫无意义。

其次,您需要通过优化同一个指针上的多个动态转换来确保编译器不会给您错误的结果(因此使用循环,但每次使用不同的输入指针)。

动态转换会比较慢,因为它需要访问对象的 RTTI(运行时类型信息)表,并检查转换是否有效。然后,为了正确使用它,您需要添加错误处理代码来检查返回的指针是否为 NULL。所有这些都占用了周期。

我知道你不想谈论这个,但“一个经常使用 dynamic_cast 的设计”可能表明你做错了什么......

关于c++ - dynamic_cast 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050901/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com