jvm 《七》對Java HotSpot VM進行基準(zhǔn)測試 or 為什么HotSpot不能讓我的圖形代碼變得更快瘸右?

我寫了一個簡單的循環(huán)來計算一個簡單的操作娇跟,

我要研究一下他為啥這么慢?

public class Benchmark {

public static void main(String[] arg) {

long before = System.currentTimeMillis();

int sum = 0;

for (int index = 0; index < 10*1000*1000; index += 1) {

sum += index;

}

long after = System.currentTimeMillis();

System.out.println("Elapsed time: " +

Long.toString(after - before) +

" milliseconds");

}

}


HotSpot的工作原理:

? ? ? ?它首先使用解釋器運行程序太颤。當(dāng)它發(fā)現(xiàn)某些方法是“熱”時 - 也就是說苞俘,執(zhí)行了很多,要么因為它被調(diào)用很多龄章,要么因為它包含循環(huán)很多的循環(huán) - 它會發(fā)送該方法以進行編譯吃谣。之后,將發(fā)生兩件事之一做裙,或者在下次調(diào)用該方法時岗憋,將調(diào)用編譯版本(而不是解釋版本),或者使用編譯方法替換當(dāng)前長時間運行的循環(huán)锚贱,同時仍在運行澜驮。后者被稱為“堆棧替換”或OSR。

同時惋鸥,如果你堅持使用/編寫這樣的微基準(zhǔn)杂穷,你可以通過將main的主體移動到一個新方法并從main調(diào)用一次來給編譯器編譯代碼的機會悍缠,然后調(diào)用它再次出現(xiàn)在計時器中,看看HotSpot的速度有多快耐量。

另請參閱JavaOne 2002演示文稿?S-1816如何不編寫Microbenchmark

我正在嘗試計算方法調(diào)用時間飞蚓。我不希望有任何額外的工作,所以我使用一個空方法廊蜒。但是當(dāng)我使用HotSpot運行時趴拧,我得到的速度令人難以置信。這是我的代碼:

public class EmptyMethod {

public static void method() {

}

public static void runTest() {

long before;

long after;

// First, figure out the time for an empty loop

before = System.currentTimeMillis();

for (int index = 0; index < 1*1000*1000; index += 1) {

}

after = System.currentTimeMillis();

long loopTime = after - before;

System.out.println("Loop time: " +

Long.toString(loopTime) +

" milliseconds");

// Then time the method call in the loop

before = System.currentTimeMillis();

for (int index = 0; index < 1*1000*1000; index += 1) {

method();

}

after = System.currentTimeMillis();

long methodTime = after - before;

System.out.println("Method time: " +

Long.toString(methodTime) +

" milliseconds");

System.out.println("Method time - Loop time: " +

Long.toString(methodTime - loopTime) +

" milliseconds");

}

public static void main(String[] arg) {

// Warm up the virtual machine, and time it

runTest();

runTest();

runTest();

}

}


空方法不計算在內(nèi)山叮。而且您還看到生成的代碼對齊對象非常敏感著榴。

對空方法的調(diào)用正在被內(nèi)聯(lián),因此實際上沒有時間調(diào)用屁倔。編譯器在其調(diào)用站點將內(nèi)聯(lián)小方法脑又。這減少了對小方法的調(diào)用的開銷。這對于用于提供數(shù)據(jù)抽象的訪問器方法特別有用锐借。如果該方法實際為空问麸,則內(nèi)聯(lián)將完全刪除該調(diào)用。

代碼生成到內(nèi)存中并從那里執(zhí)行钞翔。代碼在內(nèi)存中的布局方式對其執(zhí)行方式有很大影響严卖。在我的機器上的這個例子中,聲稱調(diào)用該方法的循環(huán)更好地對齊布轿,因此比試圖計算運行空循環(huán)所需多長時間的循環(huán)運行得更快哮笆,所以我得到負數(shù)?methodTime-loopTime。

好的汰扭,所以我會在方法的主體中放入一些隨機代碼稠肘,因此它不是空的,并且內(nèi)聯(lián)不能只刪除它东且。這是我的新方法(并且調(diào)用站點更改為調(diào)用方法(17)):

public static void method(int arg){

int value = arg + 25;

}


HotSpot編譯器足夠智能启具,不會為死變量生成代碼。

在上面的方法中珊泳,從不使用局部變量鲁冯,因此沒有理由計算其值。因此色查,方法體再次為空薯演,當(dāng)代碼被編譯時(并且內(nèi)聯(lián),因為我們刪除了足夠小的代碼以便內(nèi)聯(lián))秧了,它又變成了一個空方法跨扮。

對于那些不習(xí)慣處理優(yōu)化編譯器的人來說,這可能是令人驚訝的,因為他們可以非常聰明地發(fā)現(xiàn)和消除死代碼衡创。它們偶爾可能相當(dāng)愚蠢帝嗡,所以不要指望編譯器對代碼進行任意優(yōu)化。

死代碼消除也擴展到控制流程璃氢。如果編譯器可以在測試中看到特定的“變量”實際上是常量哟玷,則可以選擇不編譯永遠不會執(zhí)行的分支的代碼。這使得微基準(zhǔn)測試“足夠棘手”以實際計算您認為您的計時時間變得棘手一也。

死代碼消除在實際代碼中非常有用巢寡。并不是說人們故意寫死代碼;?但是,由于內(nèi)聯(lián)常常(例如椰苟,方法的實際參數(shù))替換變量抑月,使得某些控制流失效,編譯器通常會發(fā)現(xiàn)死代碼舆蝴。

我正在嘗試對對象分配和垃圾收集進行基準(zhǔn)測試谦絮。所以我有上面的那個,但方法的主體是:

public static void method(){

Object o = new Object();

}


這是HotSpot存儲管理器的最佳案例须误。你會得到不切實際的數(shù)字挨稿。

您正在分配不需要初始化的對象仇轻,并立即將它們放在地板上京痢。(不,編譯器不夠聰明篷店,無法優(yōu)化分配祭椰。)真正的程序確實分配了相當(dāng)數(shù)量的短期臨時對象,但它們也比這個簡單的測試程序更長時間地保留了一些對象疲陕。HotSpot存儲管理器為保留更長時間的對象執(zhí)行更多工作方淤,因此請注意嘗試將此類測試中的數(shù)字擴展到實際系統(tǒng)。

我有一個圖形密集型或基于GUI的程序蹄殃。為什么HotSpot不能讓我的圖形代碼變得更快携茂?

圖形程序?qū)⒋罅繒r間花在本機庫中。

Java應(yīng)用程序的整體性能取決于四個因素:

應(yīng)用程序的設(shè)計

虛擬機執(zhí)行Java字節(jié)碼的速度

執(zhí)行基本功能任務(wù)的庫執(zhí)行的速度(以本機代碼表示)

底層硬件和操作系統(tǒng)的速度

虛擬機負責(zé)字節(jié)代碼執(zhí)行诅岩,存儲分配讳苦,線程同步等。與虛擬機一起運行的是本機代碼庫吩谦,它們通過操作系統(tǒng)處理輸入和輸出鸳谜,尤其是通過窗口系統(tǒng)的圖形操作。在這些本機代碼庫中花費大量時間的程序?qū)⒉粫吹剿鼈冊贖otSpot上的性能提高與花費大部分時間執(zhí)行字節(jié)代碼的程序一樣多式廷。

關(guān)于本機代碼的這種觀察適用于您恰好與應(yīng)用程序一起使用的其他本??機庫或任何本機代碼庫咐扭。

您對HotSpot或任何虛擬機進行基準(zhǔn)測試的建議

這里最好的答案是使用真實的應(yīng)用程序進行基準(zhǔn)測試,因為它們是唯一能夠產(chǎn)生真正差異的應(yīng)用程序。如果無法做到這一點蝗肪,請使用標(biāo)準(zhǔn)SPEC基準(zhǔn)測試袜爪,然后使用其他備受推崇的行業(yè)基準(zhǔn)測試。應(yīng)避免使用微量標(biāo)記薛闪,或至少要謹慎使用饿敲。微基準(zhǔn)測試由于優(yōu)化效果而給出誤導(dǎo)性答案是很常見的。


---------------------

作者:a_Ygygs_Dxdsr_XdMss

來源:CSDN

原文:https://blog.csdn.net/weixin_42749765/article/details/87454013

版權(quán)聲明:本文為博主原創(chuàng)文章逛绵,轉(zhuǎn)載請附上博文鏈接怀各!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市术浪,隨后出現(xiàn)的幾起案子瓢对,更是在濱河造成了極大的恐慌,老刑警劉巖胰苏,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕蛹,死亡現(xiàn)場離奇詭異,居然都是意外死亡硕并,警方通過查閱死者的電腦和手機法焰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔毙,“玉大人埃仪,你說我怎么就攤上這事∩略撸” “怎么了卵蛉?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長么库。 經(jīng)常有香客問我傻丝,道長,這世上最難降的妖魔是什么诉儒? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任葡缰,我火速辦了婚禮,結(jié)果婚禮上忱反,老公的妹妹穿的比我還像新娘泛释。我一直安慰自己,他們只是感情好缭受,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布胁澳。 她就那樣靜靜地躺著,像睡著了一般米者。 火紅的嫁衣襯著肌膚如雪韭畸。 梳的紋絲不亂的頭發(fā)上宇智,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音胰丁,去河邊找鬼随橘。 笑死,一個胖子當(dāng)著我的面吹牛锦庸,可吹牛的內(nèi)容都是我干的机蔗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼甘萧,長吁一口氣:“原來是場噩夢啊……” “哼萝嘁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扬卷,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牙言,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怪得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱枉,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年徒恋,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚕断。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡入挣,死狀恐怖亿乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情财岔,我是刑警寧澤风皿,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布河爹,位于F島的核電站匠璧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咸这。R本人自食惡果不足惜夷恍,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳维。 院中可真熱鬧酿雪,春花似錦、人聲如沸侄刽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州丹。三九已至醋安,卻和暖如春杂彭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吓揪。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工亲怠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柠辞。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓团秽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叭首。 傳聞我的和親對象是個殘疾皇子习勤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容