如果我有一个具有50个getter / setter的对象,其中每10个都在新接口下定义,并且我将对象键入其中一个接口,它会提高性能吗?
不确定方法/变量查找是如何工作的,但似乎如果您将对象键入具有较少方法的对象,那么运行这些方法会更快?
我要求使用Actionscript / Java,但这适用于我猜的任何语言。
因此,如果我有一个对象,DisplayObject,它实现了5个接口(IResizable,IScalable,IMovable,IMeasurable,IDrawable),并且我将其键入IResizable来访问x和y访问器,那是一个优化吗?
否则,似乎接口的唯一用途是使代码更具可读性,并确保您坚持定义的模式。
答案 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次并测量哪个更快。
执行此操作后,为每个函数添加一些工作(你知道,做一个平方根或其他东西)。观察先前测试淡入淡出与噪声的相关性