Perf4j主要的用途是計(jì)量代碼性能和分析性能數(shù)據(jù)。
為什么要使用這個(gè)工具呢?我們可以聯(lián)想下最早期java開(kāi)發(fā)者調(diào)試代碼使用的方式,以前沒(méi)有日志框架,那java開(kāi)發(fā)就使用System.out.println()來(lái)輸出自己想查看的變量。但是這樣項(xiàng)目上線(xiàn)的話(huà),就要去掉這些打印語(yǔ)句以減少性能影響。那萬(wàn)一在線(xiàn)上出問(wèn)題了,調(diào)試哪里出問(wèn)題就很麻煩,因?yàn)闆](méi)有輸出的日志可查。所以后來(lái)有人開(kāi)發(fā)了日志框架,通過(guò)日志級(jí)別控制日志的輸出。
類(lèi)似的,如果沒(méi)有perf4j,我們?cè)诓榭创a運(yùn)行時(shí)間的話(huà)可以用以下代碼來(lái)實(shí)現(xiàn):
long start = System.currentTimeMillis();
// execute the block of code to be timed
System.out.println("ms for block n was: " + (System.currentTimeMillis() - start));
這種方式有幾個(gè)缺點(diǎn):
1、 這種方式輸出內(nèi)容比較單一,就是代碼總的運(yùn)行時(shí)間。但是我們代碼需要查看的性能指標(biāo)有更多,比如總的平均值,最小值,最大值,tps等等。
2、 也許我們的代碼在線(xiàn)上運(yùn)行,我們想把這些值通過(guò)圖表的形式展示出來(lái)。或者把這些內(nèi)容通過(guò)jmx輸出。
3、 另外,我們可能把perf4j跟log4j,slf4j等日志框架和日志門(mén)面系統(tǒng)整合起來(lái)。
基于以上這些問(wèn)題,所以開(kāi)源社區(qū)就出現(xiàn)了perf4j(人多力量大,社區(qū)的力量就是強(qiáng)大)。
Perf4j一些特性:
l 簡(jiǎn)單的停止查看機(jī)制來(lái)計(jì)算語(yǔ)句時(shí)間消耗輸出。
l 命令行解析log文件產(chǎn)生匯總數(shù)據(jù)和圖表。
l 簡(jiǎn)單的集成日志框架和門(mén)面框架。
l 自定義log4j和logback的appenders來(lái)產(chǎn)生數(shù)據(jù)和圖表。
l 通過(guò)jmx查看性能指標(biāo),并根據(jù)閾值發(fā)送消息。
l Web工程可以通過(guò)servlet來(lái)輸出性能指標(biāo)。
l Perf4j可以和aop等切面框架整合起來(lái)輸出性能指標(biāo)。
l Perf4j是一個(gè)可擴(kuò)展的架構(gòu)。