键入接口是否会提高性能?

时间:2009-10-11 21:51:22

标签: optimization interface

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

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

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

没有“搜索方法”(这是在编译时整理出来的),因此方法的数量无关紧要。

当然,这是一个通用答案,并不适用于解释代码。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

  

是优化吗?

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

  

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

接口的主要原因是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时写的。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

执行此操作后,为每个函数添加一些工作(你知道,做一个平方根或其他东西)。观察先前测试淡入淡出与噪声的相关性