【问题标题】:Does typing to interface increase performance?输入界面会提高性能吗?
【发布时间】:2009-10-11 21:51:22
【问题描述】:

如果我有一个包含 50 个 getter/setter 的对象,其中每 10 个在一个新接口下定义,并且我将该对象键入为这些接口之一,它会提高性能吗?

不确定方法/变量查找是如何工作的,但似乎如果您将对象键入具有较少方法的对象,运行这些方法会更快?

我要的是 Actionscript/Java,但这适用于我猜想的任何语言。

因此,如果我有一个对象 DisplayObject,它实现了 5 个接口(IResizable、IScalable、IMovable、IMeasurable、IDrawable),并且我将其键入为 IResizable 以访问 x 和 y 访问器,这是一种优化吗?

否则,接口的唯一用途似乎是使您的代码更具可读性,并确保您坚持定义的模式。

【问题讨论】:

  • 如果有答案,那将是非常特定于语言/平台的,当然没有简单的通用答案。
  • 太完美了 :) 我想知道这些东西。
  • 这两种功能都有。声明实例类型的变量不会改变所指向的实际对象的任何内容。
  • 很可能强制转换和相关的类型检查实际上比您试图避免的虚函数调用惩罚更昂贵。
  • 这就是我的想法,感谢您澄清这一点。我想知道,因为似乎那里的一些最好的开发人员创建了许多接口并将对象键入具有某些特定属性的接口,以便设置 x/y/width/height 等。它使代码清晰,但我认为它可能会减慢速度:)

标签: optimization interface


【解决方案1】:

如果代码在本地运行(jitted/compiled),接口方法相当于虚拟调用。一个类将有一个 v-table,其中列出了每个接口方法的函数地址。这增加了一点点间接性,但通常非常快。这与虚拟方法的工作方式相同。它们的执行速度通常相等或非常接近。

使用非虚拟方法(许多语言需要明确声明虚拟方法),地址是硬编码的,速度稍快。

没有“寻找方法”(这个是在编译时整理出来的),所以方法的数量无关紧要。

当然,这是一个笼统的答案,根本不适用于解释代码。

【讨论】:

    【解决方案2】:

    我曾经对一个 Java 程序进行基准测试,发现接口方法调用的速度是类方法调用的两倍。所以接口调用会有一些额外的开销(可能是另一个间接指针解引用)。

    但除非您对执行时间非常紧张(例如,实时音频或图形处理),否则我不确定额外的开销是否值得担心。

    【讨论】:

      【解决方案3】:

      这是优化吗?

      通过转换为接口,您可以减少该方法支持的方法数量。如果调用方法的成本与方法的数量成正比,这可能会使其更快,但是我不知道任何一种语言都是如此:所以我的回答是,“我不这么认为。”

      否则,接口的唯一用途似乎是使您的代码更具可读性,并确保您坚持定义的模式。

      接口的主要原因是 IMO 如下:例如,如果我实现这样的 DeviceManager 类 ...

      interface IDevice
      {
        string name { get; }
        string description { get; }
        bool start();
        bool stop();
      }
      
      class DeviceManager
      {
        void install(IDevice device) { ... }
        void displayUI(Windows window) { ... }
      }
      

      ...然后我可以编写一个 GUI 来管理任何实现 IDevice 接口的设备:只要他们的类实现了IDevice 接口,它甚至可以管理尚未编写类的设备实例在我写DeviceManager的时候。

      【讨论】:

        【解决方案4】:

        对于java来说,因为一个对象的方法调用是在运行时决定的,所以这并不重要。接口不仅仅是为了可读性,它是用来确保对象的层次结构和多态性。

        【讨论】:

          【解决方案5】:

          在使用这两种方法的环境中编写一个测试程序。让每个方法被调用 1000000 次并测量哪个更快。

          在你这样做之后,为每个函数添加一点点工作(你知道,做一个平方根之类的)。观察您之前测试的相关性逐渐消失

          【讨论】:

            猜你喜欢
            • 2013-04-12
            • 1970-01-01
            • 2011-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-13
            • 2010-10-23
            相关资源
            最近更新 更多