2017-02-22 64 views
1

問題: 將對象包裝到另一個對象內的性能成本是多少?內存和CPU使用率均從直接調用對象增加。包裝的性能代碼

附加信息: 我正在開發一個框架,它將封裝代碼以隔離插件與程序的核心實現。這個問題不斷涌現在我的腦海中「性能成本是多少」。我知道這不僅僅是直接訪問被封裝的代碼。但是,我似乎無法在網上找到任何可靠來源或數據,以準確顯示預期的結果。這是一個問題,因爲我正在開發這個項目來替代大約40個項目的實現。因此,當被問及更新期望的開銷水平時,我需要有一些數據。

此外,如果有人不確定我的意思是包裝的代碼。這是一個使用一個接口創建對象的過程,該接口將所有方法調用發送到存儲在對象中的對象。這是爲了在原始對象不能被修改或改變以包含接口時隱藏對象的實現。以下是我正在談論的一個例子。

public class WrapperObject implements WrapperInterface 
{ 
    private SomeObjectClass theObject; 

    public WrapperObject(SomeObjectClass theObject) 
    { 
     this.theObject = theObject; 
    } 

    public void method1() 
    { 
     theObject.method1(); 
    } 

    public void method2() 
    { 
     theObject.method2("someData", 1); 
    } 
} 

我也知道JIT在Java和其他優化技術JVM中的作用。我問我可以期望從一個大型項目使用這樣的系統開銷。正如我在包裝或轉換插件代碼之前所做的一切。這包括可能被稱爲每秒幾千次的方法以及僅調用一次的方法。

我也將在接下來的幾天內構建原型來測試性能。我只是尋找一些設計意見,以更好地理解期望。而不是盲目地看我的代碼猜測浪費時間。

+1

衡量它,不要作假設。如果JIT決定內聯或直接調用包裝對象,則性能成本可能爲0。 – john16384

+0

正如我所說我知道關於JIT,我沒有做出假設。我打算對原型進行測試。我正在尋找的是一些知識來幫助解釋我所看到的。這樣我就不會做出假設並猜測發生了什麼。 – DarkGuardsman

+0

如果包裝對象的性能成本是一個問題,那麼你最好放棄面向對象編程。這是你在Java中應該擔心的最後一件事。 – jaco0646

回答

1

很難估計性能/ CPU消耗,因爲它實際上取決於您將如何處理該對象以及如何處理它們。但是你可以相對較好地測量RAM的消耗。

沒有進入詳細信息,可以測量物體作爲

  • 大小標頭(16 bytes爲64位JDK)
  • 大小原始部件(發現在the documentation大小)
  • 的總和的大小參考成員的大小(用於64位JDK的8 bytes
  • 偏移量大小(用於均衡的幾個字節)

您的特定對象將包含標題,一個引用和偏移量。

注意這是近似值,確切的大小取決於很多其他因素,但它會幫助您設想將消耗多少內存。

有關不同類型的大小更多的細節來看看on this question

+0

謝謝,這將幫助很好。你至少在猜測CPU部分? – DarkGuardsman

+0

即使猜測也很難,因爲可能有影響性能的因素(從應用程序的用例到垃圾收集器策略)。我可以建議的唯一事情是閱讀所有關於Java內存模型並分析你的用例。你可以從[this]開始(https://dzone.com/articles/java-performance-tuning) –

+0

謝謝,我會在這裏稍微閱讀一下,看看它是否有幫助:) – DarkGuardsman