2009-10-11 56 views
1

如果我有一個包含50個getter/setter的對象,其中每10個對象被定義在一個新的接口下,並且我將這個對象作爲其中一個接口,它是否會提高性能?輸入接口是否可以提高性能?

不知道如何使用方法/變量查找,但似乎如果您鍵入對象的方法較少的東西,運行這些方法會更快?

我在詢問Actionscript/Java,但這適用於我猜測的任何語言。所以如果我有一個實現了5個接口(IResizable,IScalable,IMovable,IMeasurable,IDrawable)的對象,DisplayObject,並且我將它鍵入爲IResizable來訪問x和y訪問器,那麼這是一種優化嗎?

否則,它似乎接口的唯一用途是使您的代碼更具可讀性,並確保您堅持定義的模式。

+5

如果這有一個答案,它將是*非常*語言/平臺的具體情況,肯定沒有簡單的一般答案。 – skaffman 2009-10-11 21:54:29

+0

這是完美:)我想知道這些東西。 – 2009-10-11 21:59:11

+0

功能有兩種方式。聲明實例類型的變量不會改變任何有關指向的實際對象。 – Dolphin 2009-10-11 22:08:14

回答

4

如果代碼是本地運行(jitted/compiled),則接口方法相當於虛擬調用。一個類將有一個v表,列出每個接口方法的函數地址。這增加了一點間接性,但通常非常快。這與虛擬方法的工作方式相同。執行速度通常相同或非常接近。

使用非虛擬方法(許多語言要求虛擬方法被顯式聲明爲這樣),地址是硬編碼的並且速度稍快。

沒有「搜索方法」(這是在編譯時進行排序),所以方法的數量是不相關的。

當然,這是一個普遍的答案,根本不適用於解釋的代碼。

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時尚未寫入類的設備實例。

0

對於java來說,因爲對象的方法調用是在運行時決定的,所以它並不重要。一個接口不僅僅是可讀的,它用於確保對象層次和多態性。

3

我曾經對一個Java程序進行了基準測試,發現接口方法調用的速度是類方法調用的兩倍。所以接口調用會有一些額外的開銷(可能是另一個間接指針取消引用)。但是除非你在執行時間上非常緊張(例如,實時音頻或圖形處理),否則我不確定額外的開銷是否值得擔心。

0

在使用這兩種方法的環境中編寫測試程序。每個方法調用1000000次並測量哪個更快。

做完這些之後,爲每個函數添加一小部分工作(你知道,做一個平方根或其他東西)。注意你以前的測試衰減的相關性到噪音