Java コードのさまざまなメソッドの CPU 使用率を測定する方法を探しています。これは JNI と C を使用して実現できることは理解していますが、どこから始めればよいかわかりません...
これの目的は、異なるアルゴリズムを比較し、定性的な結果を提供することです。
Java コードのさまざまなメソッドの CPU 使用率を測定する方法を探しています。これは JNI と C を使用して実現できることは理解していますが、どこから始めればよいかわかりません...
これの目的は、異なるアルゴリズムを比較し、定性的な結果を提供することです。
Sun VisualVM は最近の JDK に統合されており、そのプロファイリング機能についてはこちらで説明されています。これを正しく理解していれば、かなり最新のバージョンの OSX が必要なようです。
Netbeans には基本的に同じプロファイリング機構が搭載されていますが、それが役立つかどうかはわかりません。
おそらく最も一般的な方法は、samplingを使用することです。JVM には、すべてのスレッド (または関心のあるスレッド) の現在のスタック トレースと、それらが消費した CPU の量を問い合わせる機能があります。したがって、定期的にこれを行います。各呼び出しで、関心のあるメソッド内にスレッドがある場合は、そのメソッド内での最後のポーリング以降、報告された CPU 時間の半分が費やされたと想定します。
この方法が適切であると思われる場合は、少し前にJava 5 のプロファイリング機能に関する記事を書いたので、参考になるかもしれません。
Java 5 はインストルメンテーション フレームワークも提供します。これにより、指定されたメソッドの入口と出口に呼び出しを含めるようにクラスをロードするときにクラスをドクターできるため、そのメソッド内で CPU 使用率を測定できます。ただし、実際のクラス バイナリが読み込まれるときにそれらを修正する必要があるため、これをプログラムするのはもう少し複雑です。
現在の範囲のプロファイラーでは、CPU 使用率をメソッド レベルまで実際に特定できるとは思いません。ほとんどのメソッドでは、これは明らかです (メソッドがコンピューティング バウンドでシングル スレッドの場合、OS による割り当ての対象となる CPU を 100% 使用します)。
ただし、ホットスポットを特定したい場合があります (予想よりも多くの CPU を消費するメソッド、またはおそらくそれ以下の CPU を消費するメソッド) 。構成が簡単なプロファイラーについては、YourKitを参照することをお勧めします。
それができない場合は、JVM Profiling Interface ( JVMPI ) を調べてください。
メソッドを別々のスレッドで呼び出し、特定のプロシージャの実行前後の時間のデルタを測定します。
プロセス呼び出しの時間を測定するには:
ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true);
long threadTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
これがあなたが望むものかどうかはわかりませんが、過去にプロファイリングにjratを使用して、まともな結果を得ました。
ハモンをチェックしてください。非常に使いやすいです。
すでに利用可能なプロファイリング ツールのいずれかを使用する場合は、Sharkを試すことができます
OperatingSystemMXBeanおそらく、メソッドの前後に何かを見ることができます
long startProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
long endProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
Java6のみ