10

次のように、特定のコード ブロックの実行時間をテストしたいと考えています。

start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
end = System.currentTimeMillis();
System.out.println(end - start);

コードブロックを最適化するとき、次のように時間をすばやく計算するコードに注釈を付けるにはどうすればよいですか?

//start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
//end = System.currentTimeMillis();
//System.out.println(end - start);
4

6 に答える 6

4

プロファイラーを使用するだけです。最小限のフットプリントでコードを自動的に計測し、さまざまな統計とホット スポットを表示します。JVisualVM 、JProfilerまたはYourKitに組み込まれているプロファイラーを確認してください。

必要のないときは、お金は一切かかりません。

于 2012-10-28T08:02:03.560 に答える
2

これに基づいてソースコードをannotation processing作成および生成するために使用できます。compile time annotations

Properties via Annotation Processingこの記事では、アノテーションを使用してコードを生成する方法について説明します。@Start、のようなカスタムアノテーションを定義し、以下のよう@End@Calculate使用できます。ソースコードを生成しない場合、それらはとにかく削除されます。

@Start
{
      ...
      this.dosomething();
}
@End
@Caclulate

注:検査対象のコードは変更できないため、サブクラスを作成する必要があります。

于 2012-10-28T07:44:52.517 に答える
1

パフォーマンス測定用のコードを最初からメインコードから分離する。次のいずれかを実行します。

  • 彼の回答で説明されているchm052のように、いくつかのフラグとガードされたコマンドがあります。
  • SLF4Jなどのこれらの保護されたコマンドでロギングフレームワークを使用する。
  • (マイクロ)ベンチマークツールを使用することにより、適切な時間測定、統計、および保護されたコマンド(AspectOrientedProgrammingなどを介して)を支援します。賢明な測定値を取得するには、このようなツールを必ず使用する必要があります(https://stackoverflow.com/a/7120803/750378などを参照)。
于 2012-10-28T07:46:07.523 に答える
1

chm052によって提案されたアプローチは確かに機能しますが、時間測定時間ロジックをビジネスメソッドに結合するため、望ましくありません。結局、メソッドは「dosomething()」を実行するように記述されています-そしてこれらの前後で時間を測定したいと思います。明日は、「メソッドの入力/メソッドdoSomethingの終了」というステートメントのリンクをログに記録する必要があります。しばらくすると、このコードを実行できるかどうかのアクセス許可を確認する必要があります。

このアプローチは単純なプロジェクトには適していますが、無関係な懸念でコードを汚染することになります。

いくつかのテクニックがあります。

  1. AOP、これはすでにJoachimIsakssonによって提案されました。AOPはこの分野で本当に輝いています。時間測定ロジックを使用して準備ができているアドバイスを作成します。

  2. OOPテクノロジーに固執したい/必要がある場合は、プロキシ またはデコレータを作成することをお勧めします

技術的には互いに非常に近く、懸念の意図をどのように念頭に置いているかだけです。

お役に立てれば

于 2012-10-28T07:46:52.733 に答える
1

単純なものが必要な場合は、debugデバッグ情報を出力したいときに true である (ブール値の) 変数を常に持つことができます。次に例を示します。

if (debug) start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
if (debug) {
    end = System.currentTimeMillis();
    System.out.println(end - start);
}

これを行っているときは、コマンド ライン引数を使用して設定することが多いdebugため、デバッグ モードを切り替えるためにコードを変更する必要はありません。

編集:プログラムの他の場所でこの構造を繰り返したい場合は、他の回答で述べたように、私は間違いなくAOPを使用します。

于 2012-10-28T07:34:56.447 に答える
-1

私はあなたの意味がよくわかりません。コードにコメントを付けたいだけの場合、ショートカットはEclipseのctrl+/です。また、プロジェクトでこの種のコードをソートしようとすると、log4jを使用してこの種のことを実行できます。

于 2012-10-28T07:43:05.190 に答える