2011-09-25 13 views
0

私は奇妙な作業をしました。私はリファクタリング大きなコードベース(簡単な部分)で特定のメソッドとパフォーマンスの利得レポートを提供する必要があります。私は実行とメモリ使用のスピードに焦点を当てるべきです。彼らは方法でパフォーマンスの向上を知りたい!Javaメソッドのリファクタリングパフォーマンスを測定する

だから私はこのような方法があります:私はちょうどログを処理する必要が最後に

public void processHugeFile(File f) { 
    long start = java.lang.System.currentTimeMillis(); 

    // just lists, some primitives, simple logic,... 

    long end = java.lang.System.currentTimeMillis(); 
    logger.log("performance comparison - exec time: " + (end - start)); 
} 

public void processHugeFile(File f) { 
    long start = java.lang.System.currentTimeMillis(); 

    // lots of hashmaps, lots of arrays, weird logic,... 

    long end = java.lang.System.currentTimeMillis(); 
    logger.log("performance comparison - exec time: " + (end - start)); 
} 

その後、私はそれをリファクタリングする必要があります。

しかし、何についてメモリ使用量?私はgetRuntime().totalMemory() - getRuntime().freeMemory()getHeapMemoryUsage().getUsed()を試しましたが、動作していないようです。また、JVMプロファイラはメソッドではないオブジェクトに焦点を当てています。私はかなり大きなコードベースを話しています。

誰かに私にいくつかのヒントを教えてもらえますか?

ありがとうございました。

+0

メモリ使用量の変更を判断するために、時間の経過とともにプロファイルをプロファイルする必要があります。最大/平均メモリ消費量、GCで消費された時間などです。 –

答えて

2

リファクタリングは、パフォーマンスを向上させる手段ではなく、コードベースの可読性とメンテナンス性を向上させる手段です。 (これにより、より自信を持って最適化とアーキテクチャの変更を行うのに役立つかもしれません)。私はあなたがこれを認識していると仮定し、処理中のコードの一部をクリーンアップしようとしています。

これは本当にプロファイラー用のツールであり、手動計測用ツールではありません。あなたはこのように正確な測定値を得ることはありません。たとえば、System.currentTimeMillis()呼び出しは独自のオーバーヘッドを追加し、短命メソッドの場合はメソッド自体よりも時間がかかることがあります。 Runtimeは、メモリ使用量の粗い画像を取得するのに役立ちます。

私は、プロファイラーが手助けできないことに同意しません。例えば、JProfilerは時間の経過とともにヒープサイズをグラフに表示し、世代サイズを含めます。割り当てサイト、オブジェクトタイプによってメモリ使用量を分割します。包括的/排他的時間によるパフォーマンスのボトルネックが表示されます。そして、あなたのコードに触れることなく、このすべて。

本当に、本当に、JProfilerのようなプロファイラを使用したいのですが、手書きのものではありません。

0

プロファイラーを使用してください。このようにしていると、結果が歪む可能性があります。

たとえばNetbeansを使用している場合は、profilerが組み込まれています。

1

プロファイラを使用することもできますが、プログラムの実行後にガベージコレクションロギングを有効にしてからanalysing GCログを有効にすることもできます。

これは、ガベージコレクションに費やされた時間とガベージコレクションに費やされた時間を表示します。これは、GCの使用量が多すぎることに気づいた場合や世界コレクションを停止した場合などスループットに影響するのは、待ち時間要件&です。

0

私はこの要件に困惑しています。私はSean氏にリファクタリングがパフォーマンス上の理由ではなく設計上の理由で行われていることに同意します。 先験者の理由のパフォーマンスの向上が一般的であり、利益について十分な疑念がある場合は、まったく実行すべきではない可能性があります。

多分あなたはアルゴリズム分析を行うべきではないでしょう:これはほとんどの場合、Big-O用語で分析結果を得られるほど簡単です:Big-Oに明らかに目に見える利点がない場合おそらくパフォーマンス上の利点はあまりありません。

関連する問題