2014-07-18 62 views
1

假設我有一個方法foo我應該在斷言中裝箱還是取消裝箱?

public Integer foo() { return 1; } 

哪個以上到選項的較小昂貴?拳擊還是拆箱?

assert(1, (int) foo())); 

assert((Integer)3, foo()); 
+1

這只是一個簡單的例子,使問題更容易理解,或者這是真實的情況嗎?這是waaaaaay太微觀優化。選擇最易讀,更易於理解的方式。即使性能存在差異(因爲可能不存在),如果您運行該代碼的次數達到了一千次,您會在納秒級別上發生變化! – acdcjunior

+0

你爲什麼要返回一個'Integer'? –

回答

1
信息

我認爲基本類型變量比較多於對象比較快。拳擊也需要更多的時間來創建包裝對象。所以你應該在斷言中使用拆箱。

6

了上述期權的較小貴嗎?拳擊還是拆箱?

你正專注於錯誤的問題,當你問這是昂貴。這是過早優化的一個例子,使用包裝類會對性能產生輕微的影響。所以,如果你想優化你應該使用原始int

public int foo() { return 1; } 

並且不要試圖優化斷言,它們可以(也可能應該)在生產環境中被禁用。

java -help

java -help | grep assertions 

-ea[:<packagename>...|:<classname>] 
-enableassertions[:<packagename>...|:<classname>] 
       enable assertions with specified granularity 
-da[:<packagename>...|:<classname>] 
-disableassertions[:<packagename>...|:<classname>] 
       disable assertions with specified granularity 
-esa | -enablesystemassertions 
       enable system assertions 
-dsa | -disablesystemassertions 
       disable system assertions