torutkのブログ

ソフトウェア・エンジニアのブログ

アニメーションを使用するJavaFXプログラムのCPU使用率低減(キャッシュ)

JJUG CCC 2015 Springで発表(JJUG CCC 2015 Springに参加して(#jjug_ccc) - torutkのブログ)した、JavaFXを使って作成したアナログ時計(SVG版)を実行すると、アニメーションを使用して時計の針の動きを実現しているので、CPUをそれなりに喰います。

JavaFXのアニメーション機能は、60FPSを想定した16ms周期の処理が動いているため、CPUが喰われるのもある程度は仕方がないなとは思っています。が、JJUG CCC 2016 Springで発表(日本Javaユーザーグループ主催コミュニティカンファレンス2016春でjavapackagerネタで発表(#jjug_ccc) - torutkのブログ)した、デスクトップアプリケーションはCPUとメモリを控え目に使うべしとの主張と反してしまいます。なるべくCPU使用率を抑えたいところです。

そこで、何かCPU使用を抑える方法がないかを調べていたところ、ノードにはキャッシュ機構があり、これを有効にすることでノードのビットマップ表現がメモリ上にキャッシュされます。(デフォルトは無効)
Node (JavaFX 8)

今回、アナログ時計の表示を構成する時計盤、針のノードのキャッシュを有効にします。Scene Builderで画面を設計している場合は、対象となるノードを左下ペインで選択し、右ペインで選択したノードのプロパティのCacheプロパティにチェックを付け、Cache HintにはSPEEDを設定します。

元のアナログ時計プログラムと、各ノードのキャッシュを有効にしたアナログ時計プログラムの双方を実行し、それぞれCPU使用率の1分間の平均を測定しました。

Cache指定なし Cache指定あり
23.2% 13.4%


この結果から、ノードのキャッシュを有効にすることで、CPU使用率の低減に効果があることが分かりました。

測定環境

今回の測定環境は次のとおりです。

CPU Intel Core i5-4210Y 1.50GHz 2core/4thread
メモリ 8GB
OS Windows 10 Home 64bit
Java Java SE 8 Update92 32bit
測定ツール typeperfコマンド

typeperf コマンドを次のように1分間実行して、1秒ごとにjavaプロセスのCPU使用率を取得し、それをファイルに保存します。

D:\work> typeperf "\Process(java*)\% Processor Time" > result.csv

次にCSVファイルに書かれたCPU使用率の平均値を算出します。今回は安直にExcelで読み込み、平均値の算出とグラフ化をしました。

他の手段

アニメーションを使用するJavaFXプログラムのCPU使用率低減(フレームレート) - torutkのブログに、フレームレートの設定でCPU使用率を削減する方法を記載しました。