簡體   English   中英

Java的首次執行性能

[英]First time execution performance of Java

我一直在Linux上用C ++開發一個報告引擎(RE是為了生成PDF報告)。 如果生成的PDF報告必須包含一些圖表,則在構建報告時需要構建它們。 ChartBuilder用Java編寫(帶有Java-TeeChart的JFreeChart-沒關系)。 好的,RE在構建報表時,會通過JNI調用一些ChartBuilder-API函數來逐步構建一個圖表(或多個圖表)(ChartBuilder被打包到.jar文件中)。 問題在於,構建第一個圖表需要花費大量時間(也就是說,在流程生命周期中第一次執行每個ChartBuilder-API函數)! 更具體地說,構建第一張圖表大約需要1.5秒。 如果要創建多個圖表,則其余圖表將在大約(〜0.05,〜0.1)秒內生成。 那比第一個快30倍! 值得注意的是,第一個圖表與其余圖表相同(數據除外)。 這個問題似乎是Java的根本問題(我對這個平台不是很熟悉)。 下面是說明所描述問題的圖片:

在此處輸入圖片說明

我想知道是否有一種方法可以加快第一次執行的速度。 非常了解如何避免第一次執行時的開銷,因為現在它會妨礙RE的整體性能。

另外,我想描述它的工作方式:有人用所有需要的參數調用C ++ RE :: CreateReport。 如果需要,此函數將創建一個JVM並通過JNI對其進行請求。 創建報告后,JVM被銷毀。

提前致謝!

即時編譯 使您的JVM作為服務保持活動狀態,以避免多次支付JIT編譯成本。

我認為這很可能是人們在評論和其他答案中指出的事情的結合-JVM啟動,類加載器,Java在運行代碼時“解釋”您的代碼等事實。

大多數屬於“首次啟動”開銷類別,因此在后續運行中具有更高的性能。

我個人傾向於同意托馬斯(在對您的問題的評論中),最高的開銷可能是類加載器。

您可以使用一些工具來概要分析Java JVM,以了解JVM自身花費的時間最多的時間,例如:

您必須謹慎使用這些工具來思考結果,您可能需要三思而行-您可能希望分別測量首次運行和后續運行,並且還可能希望將自己的系統計時添加到包裝JNI調用的C ++代碼中,以獲得更好的端到端時序圖。 借助性能監控,多次測試運行非常重要,因為一個或另一個原因(例如,計算機上的其他負載-甚至是非共享筆記本電腦上的負載),允許進行緩慢和快速的單獨運行。

正如LeffeBrune提到的,如果您可以讓圖表構建器已經作為服務運行,它可能會加快第一次運行的速度,盡管您可能需要試驗一下,看看如果它實際上未在處理器上運行會產生多大的不同。例如一段時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM