2017-03-08 144 views
5

我是jmh的新手,瞭解線程後面發生的事情等。JMH狀態類和共享與非共享狀態

於是,我開始讀書,貼在@state註釋和共享VS非共享狀態。

我讀到這個例子:http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_03_States.java ,並對此有幾個問題。

第一個問題,狀態類的確切作用是什麼?保存參數? 假設我想以兩種不同的方式對一個密鑰加密的程序進行基準測試。 我是否應該將鍵(一個String對象)保存在一個用特定狀態註釋的狀態類中?或者只是保持基準類的String對象? 對此的解釋會很好。

第二個問題,爲什麼在上面的非共享狀態級性能的例子是比共享一個更好? 多線程狀態如何改變它?

我覺得真的很模糊,因爲我是新來的這件事情,但沒有找到一個「解釋我就像我5」江鈴控股的例子,它的選項。

回答

2

,你需要不,對於它的創作時間應被視爲您的測量時間的一部分運行它,你可以考慮@State對象作爲你的基準的一部分。

讓我們說,要衡量它需要計算時間:

@Benchmark 
int benchmark() { 
    int foo = 1, bar = 1; 
    return foo + bar; 
} 

不幸的是你,JIT編譯器是很聰明,不會讓你做到這一點,將摺疊的方法簡單地返回2 。這當然不是你想要測量的。使用狀態,你可以逃避這些值,讓JMH負責不讓JIT摺疊它的值。您將初始化@Setup方法中的值。

作爲另一個用例,您可以檢查基準是否符合您的預期。這可以通過驗證@TearDown方法中的狀態來實現。

+0

所以,它真的如果我繼續在基準類我的變量並進行初始化與@Setup或創建一個內部類這使變量並初始化這些事。或者只有兩種方式。 – TalOhana

+0

如果這對你更容易,第一個只是方便後者。 –