最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年07月11日 11:39:08   作者:flydean  
這篇文章主要介紹了如果你想寫自己的Benchmark框架,本文通過給大家分享八條軍規(guī),幫助大家理解,需要的朋友可以參考下

簡介

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

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

八條軍規(guī)

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

第一條軍規(guī)

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

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

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

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

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

第二條軍規(guī)

在JMH中,我們一般需要設(shè)置warmup和measurement的次數(shù):

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

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

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

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

第三條軍規(guī)

在編寫B(tài)enchmark的同時,一定要開啟JVM的日志。例如: -XX:+PrintCompilation, -verbose:gc等。

為什么呢?

大家想想benchmark是做什么的呢?就是統(tǒng)計時間的。

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

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

第四條軍規(guī)

注意JIT的分層編譯。

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

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

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

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

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

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

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

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

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

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

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

-XX:+TieredCompilation

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

Client編譯和Server編譯,甚至是OSR都是不同的。大家在寫B(tài)enchmark的時候一定要注意。

第五條軍規(guī)

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

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

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

第六條軍規(guī)

要注意反優(yōu)化和重編譯的影響。

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

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

下面是比較常見的情況:

1.需要調(diào)試的情況

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

2.代碼廢棄的情況

當(dāng)一個被編譯過的方法,因為種種原因不可用了,這個時候就需要將其反優(yōu)化。

3.優(yōu)化之前編譯的代碼

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

重編譯是指JIT可能會重新優(yōu)化代碼,導(dǎo)致重新編譯。

所以這條規(guī)則要求我們warmup的時間要盡可能的長。以便讓JIT充分優(yōu)化。

第七條軍規(guī)

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

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

最后一條軍規(guī)

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

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

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

總結(jié)

掌握上面幾條規(guī)則,相信大家也能夠?qū)懗鰧儆谧约旱腂enchmarks。

到此這篇關(guān)于如果你想寫自己的Benchmark框架的文章就介紹到這了,更多相關(guān)Benchmark框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring實現(xiàn)控制反轉(zhuǎn)和依賴注入的示例詳解

    Spring實現(xiàn)控制反轉(zhuǎn)和依賴注入的示例詳解

    這篇文章主要為大家詳細介紹IoC(控制反轉(zhuǎn))和DI(依賴注入)的概念,以及如何在Spring框架中實現(xiàn)它們,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • SpringBoot實現(xiàn)HTTP服務(wù)監(jiān)聽的代碼示例

    SpringBoot實現(xiàn)HTTP服務(wù)監(jiān)聽的代碼示例

    前后端分離項目中,在調(diào)用接口調(diào)試時候,我們可以通過cpolar內(nèi)網(wǎng)穿透將本地服務(wù)端接口模擬公共網(wǎng)絡(luò)環(huán)境遠程調(diào)用調(diào)試,本次教程我們以Java服務(wù)端接口為例,需要的朋友可以參考下
    2023-05-05
  • deepseek本地部署及java、python調(diào)用步驟詳解

    deepseek本地部署及java、python調(diào)用步驟詳解

    這篇文章主要介紹了如何下載和使用Ollama模型,包括安裝JDK?17及以上版本和Spring?Boot?3.3.6,配置pom文件和application.yml,創(chuàng)建Controller,以及使用Python調(diào)用模型,需要的朋友可以參考下
    2025-02-02
  • Java:

    Java:"失效"的private修飾符

    本文主要介紹Java 失效的private修飾符,這里整理了相關(guān)資料說明private 修飾符的作用,如何使用并與C++ 做比較,有興趣的小伙伴可以參考下
    2016-08-08
  • Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    這篇文章主要介紹了Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Java HtmlEmail 郵件發(fā)送的簡單實現(xiàn)代碼

    Java HtmlEmail 郵件發(fā)送的簡單實現(xiàn)代碼

    下面小編就為大家?guī)硪黄狫ava HtmlEmail 郵件發(fā)送的簡單實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 一次Jvm old過高的排查過程實戰(zhàn)記錄

    一次Jvm old過高的排查過程實戰(zhàn)記錄

    這篇文章主要給大家介紹了一次Jvm old過高的排查過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口

    Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口

    在類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧
    2022-05-05
  • MyBatis XML去除多余AND|OR前綴或逗號等后綴的操作

    MyBatis XML去除多余AND|OR前綴或逗號等后綴的操作

    這篇文章主要介紹了MyBatis XML去除多余AND|OR前綴或逗號等后綴的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springboot json時間格式化處理的方法

    springboot json時間格式化處理的方法

    這篇文章主要介紹了springboot json時間格式化處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論

广丰县| 汝城县| 枞阳县| 潼关县| 河源市| 安阳县| 西城区| 广宁县| 体育| 郧西县| 呼玛县| 永昌县| 凤阳县| 乌什县| 凤城市| 南召县| 若尔盖县| 舒城县| 天柱县| 瑞安市| 盐城市| 沛县| 天等县| 华池县| 辛集市| 本溪市| 乌苏市| 灵川县| 济源市| 沂水县| 宝山区| 诏安县| 白城市| 乌鲁木齐市| 桃园县| 衡东县| 辽宁省| 新安县| 门头沟区| 文山县| 禹州市|