【问题标题】:Does the usage of interfaces slow down programs? [duplicate]接口的使用会减慢程序的速度吗? [复制]
【发布时间】:2011-02-12 10:29:02
【问题描述】:

可能重复:
What is the performance cost of having a virtual method in a C++ class?

接口会减慢程序速度是真的吗?我听说是这种情况,因为在运行期间,每次使用实现此接口的对象时,都必须决定实现该对象属于哪个类。

我对 C++ 的答案特别感兴趣,但总的来说也是如此。如果这是真的,那么一些数字也会有所帮助。

非常感谢!

【问题讨论】:

    标签: c++ interface


    【解决方案1】:

    是的,但如果您需要接口所需的灵活性,这并不重要,当然也不够重要。 (请记住,如果您大量使用接口,则 vtable 的相关位最终会出现在 L1 或 L2 缓存中,因此不会像您担心的那样多。)

    【讨论】:

    • +1 L1 和 L2 缓存 - 有趣、相关和新
    【解决方案2】:

    动态调度(即使用虚函数)比直接调用更昂贵。

    但它必须是一个不寻常的程序才能成为性能限制器。更有可能限制性能的是磁盘/网络访问、更新 UI 或内存带宽等。

    【讨论】:

      【解决方案3】:

      如果您使用接口模式(即 C++ 中的抽象类),那么是的,虚拟函数调用会产生开销。但是,如果您实现自己的非抽象类机制来实现相同的目标,那么您也会有开销,可能比 VF 调用更大。所以实际上,没有额外的开销。

      【讨论】:

        【解决方案4】:

        您可能正在谈论 C++ 中的虚拟继承。如果虚拟类未在关键代码路径中使用,则性能损失很小。基本上开销与附加函数调用相同。

        【讨论】:

          【解决方案5】:

          虽然比利指出这很像other post on SO,但我认为并不完全相同...主要是因为这个问题的措辞方式。

          因为 Olga 谈到了一个“决定”,我几乎认为她在使用接口与使用派生类以及通过 dynamic_cast 确定指向对象的指针是否属于特定类之间混淆了。

          如果您正在谈论使用 dynamic_cast,那么据我所知(这不是基于具体的性能数字),您将获得相当显着的性能影响。

          如果您是在谈论使用接口,那么我觉得进行 vtable 查找和额外调用的轻微影响远远超过更好的软件设计。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-09
            • 2014-09-28
            • 2011-11-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多