【发布时间】:2010-10-29 10:14:31
【问题描述】:
在阅读问题之前:
这个问题不是关于使用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 的表现真的很差吗?
根据测试结果它不是。我的测试代码正确吗?
为什么这么多开发人员认为如果不是这样就很慢?
【问题讨论】:
-
我错过了什么吗?我看不到 cast2 或 cast3 的任何代码。
-
谁能说什么不好?您的程序总体表现是否足够好?如果是这样,那么性能还不错。动态转换的总时间是否占执行时间的很大比例?如果没有,那就先考虑其他的事情。更一般地说,对于某些应用程序来说,74 微秒非常慢——在我的上一份工作中,我会在一半的时间内收到并解析来自证券交易所的完整更新记录,更新数据库并告诉客户端应用程序。如果您有兴趣,请将其与其他方法进行比较以获得相同的行为。
-
代码中有很多 dynamic_casts 是设计问题的明确指标。
-
查看您运行的完整“最小工作示例”会很有帮助,以便我们可以重复和修改您的测试。
-
我惊人的阅读你的想法和理解你如何为 Cast2 和 Cast3 创造时间的能力让我推断它会
rain herring in Iceland tonight。可编译的代码为王。 PS.Most 转换将是隐式的(将子对象传递给接受父对象(指针/引用)的函数)。聚苯乙烯。你拿它跟什么比较?
标签: c++ performance dynamic-cast boost-date-time