2017-04-04 72 views
2

如果在實現返回硬編碼getKind的方法與在實例化期間傳入的Class.class之間存在任何顯着的運行時性能差異,那麼我想知道何時實現返回類型的方法。Java性能運行時泛型

  1. 硬編碼性能:

    public static class HardcodedFoo { 
    
        public Class<Integer> getKind() { 
         return Integer.class; 
        } 
    } 
    

其中類型是在傳入構造
  • 版。

    public static class Foo<E> { 
    
        private final Class<E> kind; 
    
        public Foo(final Class<E> kind) {this.kind = kind;} 
    
        public Class<E> getKind() { 
         return kind; 
        } 
    } 
    
  • 我知道會有一些性能影響的實例,因爲我們需要在一個領域傳遞以及美孚需要佔用更多的內存,但我很懷疑有任何顯著的運行時性能(運行時間性能只是在內存中尋找一個值,這是一直在發生的事情,因爲我們不是構建在手機上運行的精確火箭或其他任何東西,所以在內存中的一次查找不會受到傷害。至少使用毫秒精度,我幾乎不能檢測到任何真正的差異。

    爲了真正證明第一種硬編碼方法是否有任何區別?考慮到硬編碼方法會導致涉及大量重複的設計,而我可以簡化爲單一類的第二種方法。實際上,我認爲實際使用的內存和性能命中並不像用於將所有重複類加載到JVM的permgen空間(或metaspace)或其他任何內容中的實際內存那樣有效。

    +0

    作爲一個簡短的答案,並不是真的。評估性能命中率的最佳方法是查看字節碼或對循環中的大量實例進行計時 - 但實際應用程序或算法中不可能是瓶頸。 –

    +0

    我認爲你是對的最後一段(雖然我不是100%確定)。一個簡單的getter和存儲引用所需的空間,對於模擬泛化泛型而言可能比爲每個變體加載單獨類的方法便宜得多。 – flakes

    回答

    2

    至少使用毫秒精度我幾乎不能檢測到任何實際差異。

    您將需要納秒級或更高的精度。即0.000001毫秒

    主要區別在於你已經注意到了附加字段。這可能會影響大小,但由於對象通常是8個字節對齊的,引用通常是4個字節,因此引用可能會消耗填充並且不會添加對象大小。

    所涉及的內存訪問可能會增加一些時間,但由於此標題已被訪問,訪問可能位於L1緩存中的附加字段。即它通常會增加〜1ns。