我正在分析处理数百万条消息的两种设计之间的差异。一种设计使用多态,而另一种则不使用——每条消息都将由多态子类型表示。
我已经使用 VTune 分析了这两种设计。高级摘要数据似乎是有道理的——与使用 IF 语句实现的非多态版本相比,多态设计具有更高的“分支错误预测”率、更高的 CPI 和更高的“ICache 未命中”率。
多态设计有一行这样的源代码:
object->virtualFunction();
这被称为数百万次(子类型每次都更改)。由于分支目标错误预测/指令未命中,我预计多态设计会变慢。如上所述,VTune“摘要”选项卡似乎证实了这一点。但是,当我转到源代码行旁边的指标时,绝对没有指标,除了:
- 已填充的管道插槽总数 -> 退休 -> 一般退休
- 填充管道槽自我->退休->一般退休
- 未填充的管道插槽总数 -> 前端绑定 -> 前端带宽 -> 前端带宽 MITE
- 未填充的管道槽 self -> 前端绑定 -> 前端带宽 -> 前端带宽 MITE
分支预测列都没有数据,指令缓存未命中列也没有?
有人可以评论这是否合理吗?对我来说,它没有——对于一行多态代码,分支目标将不断变化的每条消息,怎么可能没有分支错误预测或指令缓存未命中统计信息?
这不可能是由于编译器优化/内联,因为编译器不知道要优化的对象的子类型。
我应该如何使用 VTune 分析多态性的开销?