3

実行時間を測定する方法については、SOで何度も質問されています。たとえば、ここまたはここを参照してください。ただし、これらの質問は主に、使用するタイミング関数に焦点を当てています。

私が興味を持っているのは、結果を再現可能にする方法です。たとえば、マルチタスクが原因で、テストされたコードの実行が、結果に影響を与えるバックグラウンドプロセスによって中断される可能性があります。これを克服するために、いくつかのベンチマークが複数の実行を行い、(ループ内でコードを複数回実行することに加えて)最適な時間を費やしているのを見てきました。

結果の信頼性と再現性を高める方法について、他に提案やアイデアはありますか?

4

2 に答える 2

1

まず、テストを高速化するコードを、テストしたくないコードの呼び出しから分離することをお勧めします。特に、そのようなコードがファイルIO、ディスプレイ出力、ロギング、コンソール出力などを実行しないことを確認してください(もちろん、IOコード自体をテストする場合を除きます)

また、事前にテスト実行に必要なすべてのデータをロードして、データのロードが測定されないようにすることもできます。

良いトリックは、できるだけテストを少なくすることです。最も大きな違いを生む数行まで追跡できれば、残りのコードとは別にそれらをテストする方法を見つけることができます。たぶん、この唯一の目的のために注意深く設計された新しい関数にそれらをコピーして貼り付けることさえできます。

高精細時間のカウントを実際に行うように設定されている場合は、OSが提供する機能を使用して、リアルタイムまたは高優先度のCPUモードに入ることもできます。

場合によっては、生成された低レベルのマシンコードを確認し、CPUメーカー(またはVM実装)からの参照データを使用して、問題のコードに必要な「CPUティック」の数を計算することができます。多くのcpu/vm命令は、パイプライン/オペランド/ cpuモデルなどに応じて実行時間が変動するため、このアプローチでもおおよその値が得られます。

したがって、最良のアドバイスは、測定の許容誤差を正しく設定することです。通常、私はいくつかのコードのタイムテストを開始するときに、これを10%と個人的に考えています。その後、この値は(通常)減少する可能性があります。しかし、それは決して0%ではありません。したがって、プログラムが「実行時間:%i ns」を出力する場合、常に「+-Xns」を出力できます(おそらくそうすべきです)。

于 2013-02-11T05:32:02.743 に答える
0

Javaで役立つ可能性のあるコードを確認してください

package com.test.stackoverflow;

public class Sample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long startTime = System.currentTimeMillis();


        for(int i=0;i<10000; ++i)
        {
            System.out.println("You ae executng Looop");
        }
        long endTime = System.currentTimeMillis();


        long diffTime = endTime - startTime;

        System.out.println("Start Execution at in Time (Seconds ) "+ startTime * 0.001);

        System.out.println("End Execution at in Time (Seconds ) "+ endTime  * 0.001);

        System.out.println("Difference in Time (Seconds ) "+ diffTime * 0.001);

    }

}
于 2013-01-07T13:05:37.273 に答える