我正在閱讀JMH框架的樣本,並且我有一個關於樣本代碼JMHSample_12_Forking的問題。運行此代碼後,我有以下結果(正如筆者預測):兩種等同方法的性能差異
testJavaUtilConcurrency.JMHSample_12_Forking.measure_1_c1 avgt 5 3.314 ± 0.200 ns/op
testJavaUtilConcurrency.JMHSample_12_Forking.measure_2_c2 avgt 5 22.403 ± 1.023 ns/op
...
這一結果解釋如下:
注意,C1更快,C2較慢,但C1是緩慢的再次!這是因爲...
但我的問題是:爲什麼C2比C1慢?兩個類中的代碼和兩種方法看起來完全一樣,那麼,性能差異的來源是什麼?
更新:
我已嘗試添加第三個實施計數器並取得以下成果:
testJavaUtilConcurrency.JMHSample_12_Forking.measure_1_c1 avgt 5 3.328 ± 0.073 ns/op
testJavaUtilConcurrency.JMHSample_12_Forking.measure_2_c2 avgt 5 22.437 ± 0.552 ns/op
testJavaUtilConcurrency.JMHSample_12_Forking.measure_2_c3 avgt 5 44.614 ± 5.080 ns/op
testJavaUtilConcurrency.JMHSample_12_Forking.measure_3_c1_again avgt 5 43.535 ± 1.154 ns/op
有趣。你能否詳細說明你的答案(*第二個測試部分*),爲什麼動態調度會使測試變慢? – rajuGT
@rajuGT:它會比內聯代碼慢,不是嗎?它涉及內存讀取和跳轉,而內聯代碼不會... –
@JonSkeet感謝您的回答,但我不確定您是否正確。我試圖爲Counter添加第三個實現,並且它給出了比第二個更高的結果(請參見更新後的問題)。 –