激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - 如果你想寫自己的Benchmark框架(推薦)

如果你想寫自己的Benchmark框架(推薦)

2020-07-11 15:11flydean JAVA教程

這篇文章主要介紹了如果你想寫自己的Benchmark框架,本文通過給大家分享八條軍規,幫助大家理解,需要的朋友可以參考下

簡介

使用過JMH的同學一定會驚嘆它的神奇。JMH作為一個優秀的Benchmark框架帶給了我們無數的歡樂。作為一個有極客精神的程序員,那么有沒有想過去自己實現一個Benchmark框架呢?

在實現Benchmark框架的時候有需要注意些什么問題呢?快來一起看看吧。

八條軍規

這里叫軍規實際上不合適,只是借用一下軍規的來彰顯一下氣勢!大家不要太介意。

第一條軍規

工欲善其事,必先利其器。想寫好一個JMH當然需要深入了解JVM的運行原理,包括JIT,C1,C2編譯器和他們的分層編譯原理,JIT運行時的編譯優化,包括Loop unrolling, Inlining, Dead Code Elimination,
Escape analysis, Intrinsics, Branch prediction等等。

當然,最好是參考一下大牛們寫過的JMH框架,找點靈感。

最后大家要了解,Benchmark框架不是萬能的。它只是在特定的環境中JVM的表現。

因為在Benchmark中我們肯定是要做循環的,一般來說就是某某方法運行多少次,這種比較簡單的循環。實際上,JVM運行的代碼是非常復雜的。Benchmark遠遠不能代表JVM的全部。

但是,見微知著,使用Benchmark還是可以一窺JVM的秘密的。

第二條軍規

在JMH中,我們一般需要設置warmup和measurement的次數:

?
1
2
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)

這是為什么呢?我們知道JIT中的代碼是動態編譯成為機器碼的,并且是需要一定的時間的。

只有JIT檢測到你這是熱點代碼,才會對其進行優化。

我們檢測代碼的性能,一般是指代碼在穩定運行的環境中的情形。而不是指第一次或者前幾次運行的時候,因為這個時候,這些代碼可能并沒有被編譯成機器碼。這樣的出來的結果往往是和實際不相符的。

第三條軍規

在編寫Benchmark的同時,一定要開啟JVM的日志。例如: -XX:+PrintCompilation, -verbose:gc等。

為什么呢?

大家想想benchmark是做什么的呢?就是統計時間的。

我們希望在運行benchmark的時候,JVM不要做任何不屬于運行代碼的任何事情,否則就可能會影響到benchmark的準確性。

所以開啟JVM的日志就是為了做校驗。不要在做benchmark的時候有其他操作。

第四條軍規

注意JIT的分層編譯。

因為Client VM和Server VM的出現,所以在JIT中出現了兩種不同的編譯器,C1 for Client VM, C2 for Server VM。

因為javac的編譯只能做少量的優化,其實大量的動態優化是在JIT中做的。C2相對于C1,其優化的程度更深,更加激進。

為了更好的提升編譯效率,JVM在JDK7中引入了分層編譯Tiered compilation的概念。

對于JIT本身來說,動態編譯是需要占用用戶內存空間的,有可能會造成較高的延遲。

對于Server服務器來說,因為代碼要服務很多個client,所以磨刀不誤砍柴工,短暫的延遲帶來永久的收益,聽起來是可以接受的。

Server端的JIT編譯也不是立馬進行的,它可能需要收集到足夠多的信息之后,才進行編譯。

而對于Client來說,延遲帶來的性能影響就需要進行考慮了。和Server相比,它只進行了簡單的機器碼的編譯。

為了滿足不同層次的編譯需求,于是引入了分層編譯的概念。

大概來說分層編譯可以分為三層:

  • 第一層就是禁用C1和C2編譯器,這個時候沒有JIT進行。
  • 第二層就是只開啟C1編譯器,因為C1編譯器只會進行一些簡單的JIT優化,所以這個可以應對常規情況。
  • 第三層就是同時開啟C1和C2編譯器。

在JDK7中,你可以使用下面的命令來開啟分層編譯:

-XX:+TieredCompilation

而在JDK8之后,恭喜你,分層編譯已經是默認的選項了,不用再手動開啟。

Client編譯和Server編譯,甚至是OSR都是不同的。大家在寫Benchmark的時候一定要注意。

第五條軍規

注意初始化對性能的影響。

如果需要加載類,一定要在warmup的階段進行加載,除非你是想去測試加載的時間。否則會對測試結果有影響。

同時也不要計算第一次print的時間,因為print也會加載和初始化一些類。

第六條軍規

要注意反優化和重編譯的影響。

JIT在下面的幾個特殊的情況下,需要對代碼進行返優化:

有些特殊的情況下面,確實是需要進行反優化的。

下面是比較常見的情況:

1.需要調試的情況

如果代碼正在進行單個步驟的調試,那么之前被編譯成為機器碼的代碼需要反優化回來,從而能夠調試。

2.代碼廢棄的情況

當一個被編譯過的方法,因為種種原因不可用了,這個時候就需要將其反優化。

3.優化之前編譯的代碼

有可能出現之前優化過的代碼可能不夠完美,需要重新優化的情況,這種情況下同樣也需要進行反優化。

重編譯是指JIT可能會重新優化代碼,導致重新編譯。

所以這條規則要求我們warmup的時間要盡可能的長。以便讓JIT充分優化。

第七條軍規

在使用benchMark得出結論之前,一定要去認真的理解JVM的底層代碼(Assembly code),找到其現象的本質。

千萬不要沖動的下結論。最好是使用可視化的工具來分析。比如說jitwatch。

最后一條軍規

在測試的時候一定要避免其他程序的影響 。

比如說兩次測試,第一次測試是單機運行,第二次測試是在有其他服務正在運行的情況下進行的。

很顯然這兩次的結果是不能做比較的。我們需要多運行,剔除噪音結果。

總結

掌握上面幾條規則,相信大家也能夠寫出屬于自己的Benchmarks。

到此這篇關于如果你想寫自己的Benchmark框架的文章就介紹到這了,更多相關Benchmark框架內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/flydean/p/how-to-write-benchmarks.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费看性xxx高清视频自由 | 国产精选在线 | 成人午夜小视频 | 午夜伊人 | 日本在线看 | 日日天日日夜日日摸 | 黄色av网站免费 | 蜜桃网在线观看 | 一级毛片真人免费播放视频 | 婷婷一区二区三区四区 | 欧美日韩免费在线观看视频 | www.7777在线| 综合精品在线 | 精品一二三区视频 | 成人综合免费视频 | 国产毛片毛片 | 国产一区二区三区精品在线观看 | 日本黄色成人 | 在线2区 | 国产午夜精品久久久久久免费视 | 精品国产一区二区三区久久久 | 精精国产xxxx视频在线野外 | 国产精品av久久久久久久久久 | 国产精品自在线拍 | 国产精品九九久久一区hh | 九九热视频在线免费观看 | 国产一区二区免费在线观看视频 | 一级做a爱片毛片免费 | 成人黄色免费视频 | 在线成人一区 | 奇米影视亚洲精品一区 | 正在播放91视频 | 一级免费黄色免费片 | 国产乱淫a∨片免费视频 | 国产亚洲精品久久久久久大师 | 成人综合一区二区 | 女教师~淫辱の动漫在线 | av在线播放亚洲 | 一本一道久久久a久久久精品91 | 成人在线免费观看小视频 | 免费久久精品 |