0

なぜこのコードが異なる時間を返すのか疑問に思います:

私の出力は次のとおりです。

Time1: 511 Time2: 228 for N: 100000000
Time1: 509 Time2: 229 for N: 100000001
Time1: 503 Time2: 229 for N: 100000002

私は持っています:

java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK Server VM (build 20.0-b12, mixed mode)
Intel® Pentium(R) CPU B960 @ 2.20GHz × 2 
Linux Ubuntu 12.04

私のコードは次のようになります:

public class test {

    public static void main(String[] arg)
    {
        for(long N=100000000;N<2000000000;++N){

            long time2 = System.currentTimeMillis();
            double d = 1.0; 
            double z = 1.0/3.0;
            for(long i = 0; i < N; i++)
            {
                d = d*z;
            }
            long result2 = System.currentTimeMillis() - time2;


            long time1 = System.currentTimeMillis();
            double x = 1.0;
            double f = 1.0/3.0;
            for(long i = 0; i < N; i++)
            {
                x = x*f;
            }
            long result1 = System.currentTimeMillis() - time1;



            System.out.println("Time1: " + result1 + " Time2: " + result2 + " bigger: " + (result1 > result2) + " for N: " + N);
        }

    }
}
4

4 に答える 4

9

Javaでのコードのベンチマークは難しいです。

JVMはバックグラウンドで多くのことを行います。

  • その場でコードを最適化し、
  • 呼び出された回数後にメソッドをコンパイルします(メソッドは突然高速化できますが、コンパイルはリソースを消費するため、しばらくの間すべてが遅くなる可能性があります)、
  • 適合していると判断した場合、変数をループの外に移動できます。
  • 何もしないことがわかった場合は、コードを単純に削除することもできます(たとえば、計算d中ですが、何もしないので、なぜ計算するのですか?JVMはそのコードを単純に削除できます。エスケープ分析」)。
  • ガベージコレクションなども発生する可能性があります。

また、オペレーティングシステムがJVMの実行などに干渉する可能性があります。

つまり、肝心なのは、JVMとオペレーティングシステムがどのように機能するかについて多くを研究することなく、正確なベンチマークを行うことを忘れることです。意味のある結果が得られるとは期待できません。

詳細については、この質問と回答を確認してください。非常に優れた論文へのリンクが含まれています。

于 2012-10-16T06:58:44.613 に答える
1

このコードを何度も繰り返しましたか?あなたが得た時間の媒体は何ですか?時間はさまざまな理由で変化する可能性があります。たとえば、プロセスとスレッドが同じCPU(1つ以上)とコンピューターの他のリソースを共有している場合などです。毎回異なる値を取得し、その違いは重要ではありません。

于 2012-10-16T06:58:47.157 に答える
0

システムの可用性はJavaによって制御されていません。

お気づきの場合は、すべての結果が同じ範囲にあります。これはあなたが期待できる最高のものです。

たとえばGarbage Collection、JVM内でも他のことが起こっている場合は、タイミングが少し変わる可能性があります。

于 2012-10-16T06:59:00.347 に答える
0

覚えておいてください:最新のオペレーティングシステムでアプリケーションを実行すると、副作用があります。他のアプリケーションもそこで実行されています。オペレーティングシステムは、さまざまなアプリケーションをスケジュールし、CPU上のすべてのプロセスタイムスロットを割り当てます。アプリケーションを実行するたびに、他のさまざまなプロセスでさまざまな順序で実行されます。これは、合計実行時間に影響します。

于 2012-10-16T07:00:02.283 に答える