Java アルゴリズムのパフォーマンスを効果的に測定するにはどうすればよいですか? それを行う正確な方法はありますか?
同じ種類の他の質問を読みましたが、満足していません。任意の助けをいただければ幸いです。
long reference=System.nanoTime();
your_funct();
long finishm=System.nanoTime();
System.out.println( ( (double)(finishm-reference) )/1000000000.0); //in seconds
私のマシンでは 0.003 秒程度の意味のあるレベルです。つまり、ナノ秒単位で測定しますが、私のマシンでは最小のステップは約 3000000 ナノ秒です。
ある種のタイミングを示すパフォーマンスを求めます。しかし、それでは何と比較しますか?
アルゴリズムを測定する一般的な方法は、簡略化された数学的アプローチを取る Big O を使用することです。
これを非常に基本的なレベルで説明すると、整数のリストの単純な線形検索には、線形 (n) 最悪の場合の大きな o があります。例: for(int i = 0; i < sizeofarray; ++i) if(array[i] == to_find) return i;
最悪の場合、これには i 回の反復が必要になります (多くの場合、数値は big o では n と呼ばれます)。そのため、n または線形複雑度アルゴリズムと呼びます。
バブルソート アルゴリズムのようなものは、ループ内のループであるため、n * n 複雑度 = n^2 または 2 次複雑度になります。
like と like を比較すると、ソートだけを考えれば、クイックソートは二次複雑度 (n log n 複雑度) よりも効率的であるため、クイックソートはバブルソートよりも「優れている」と見なすことができます。
したがって、アルゴリズムを評価するときは、n の観点から考えてください。ループはありますか?幾つか?少ないほど良い。ループはさらに良くありません-一定の大きなo。
実用的または理論的にすることができれば。実用的であれば、アルゴリズムが開始する前にタイマーを置き、終了したら停止します。理論的な場合は、Big O 表記を使用すると (それほど難しくありません)、その時間または空間の複雑さを見積もることができます。
一部のプロファイラーを使用できます。多くの IDE (Netbeans など) には 1 つがあります。