0

速度に関してアルゴリズムをテストするにはどうすればよいですか? 私が作成した拡張アルゴリズムと元のアルゴリズムは同じ深さを検索し、どちらも同じ動きをしますが、速度が異なるだけです。

私が作った新しいアルゴリズムをテストする方法を知っていますか? 開始したシステム時間をシステム時間から差し引くだけでなく、終了しました。私が言おうとしているのは、ちょっとした数式を使って、少し正式なテストを行う必要があるということです。考えられるすべての動きをシミュレートし、各アルゴリズム (拡張およびオリジナル) が動きを決定するのにかかった時間を集計する必要がありますか? 私はここでまったく無知です。

4

2 に答える 2

2

以下の方法を数回使用しましたが、成功しました。マルチスレッドのベンチマークに興味がある場合は、ページの下部にあるリンクを参照してください。

CPU、システム、およびユーザー時間を使用し たシングルスレッド タスクのタイミング CPU、システム、およびユーザー時間を使用したシングルスレッド タスクのタイミング

  • 「ユーザー時間」は、アプリケーション独自のコードの実行に費やされた時間です。

  • 「システム時間」は、アプリケーションに代わって OS コードを実行するのに費やされた時間です (I/O など)。

Java 1.5 では、JVM を監視するための java.lang.management パッケージが導入されました。パッケージのエントリ ポイントは ManagementFactory クラスです。その静的メソッドは、JVM 情報を報告するさまざまな「MXBean」オブジェクトを返します。そのような Bean の 1 つは、スレッド CPU とユーザー時間を報告できます。

ManagementFactory を呼び出します。getThreadMXBean() を使用して、現在の JVM スレッドを記述する ThreadMXBean を取得します。Bean の getCurrentThreadCpuTime() メソッドは、現在のスレッドの CPU 時間を返します。getCurrentThreadUserTime() メソッドは、スレッドのユーザー時間を返します。これらは両方ともナノ秒単位で時間を報告します (ただし、時間とナノ秒の精度 (の欠如) に関する付録を参照してください)。

ただし、最初に必ず isCurrentThreadCpuTimeSupported() を呼び出してください。false (まれ) が返される場合、JVM 実装または OS は CPU またはユーザー時間の取得をサポートしていません。その場合、壁掛け時計の使用に戻ります。

import java.lang.management.*;

/** Get CPU time in nanoseconds. */
public long getCpuTime( ) {
    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
    return bean.isCurrentThreadCpuTimeSupported( ) ?
        bean.getCurrentThreadCpuTime( ) : 0L;
}

/** Get user time in nanoseconds. */
public long getUserTime( ) {
    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
    return bean.isCurrentThreadCpuTimeSupported( ) ?
        bean.getCurrentThreadUserTime( ) : 0L;
}

/** Get system time in nanoseconds. */
public long getSystemTime( ) {
    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
    return bean.isCurrentThreadCpuTimeSupported( ) ?
        (bean.getCurrentCpuTime( ) - bean.getCurrentThreadUserTime( )) : 0L;
}

これらのメソッドは、スレッドが開始されてからの CPU、ユーザー、およびシステム時間を返します。スレッドの開始後にタスクの時間を計るには、タスクの前後にこれらの 1 つ以上を呼び出し、差をとります。

long startSystemTimeNano = getSystemTime( );
long startUserTimeNano   = getUserTime( );
... do task ...
long taskUserTimeNano    = getUserTime( ) - startUserTimeNano;
long taskSystemTimeNano  = getSystemTime( ) - startSystemTimeNano;

http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#TimingasinglethreadedtaskusingCPUsystemandusertimeから取得

于 2012-09-22T02:09:45.777 に答える
0

タイミングをキャプチャするサンプル プログラムを次に示します。必要に応じて変更できます。

package com.quicklyjava;

public class Main {

/**
 * @param args
 * @throws InterruptedException
 */
public static void main(String[] args) throws InterruptedException {
    // start time
    long time = System.nanoTime();
    for (int i = 0; i < 5; i++) {
        System.out.println("Sleeping Zzzz... " + i);
        Thread.sleep(1000);
    }

    long difference = System.nanoTime() - time;
    System.out.println("It took " + difference + " nano seconds to finish");

 }

}

出力は次のとおりです。

Sleeping Zzzz... 0
Sleeping Zzzz... 1
Sleeping Zzzz... 2
Sleeping Zzzz... 3
Sleeping Zzzz... 4
It took 5007507169 nano seconds to finish
于 2012-09-22T02:16:16.707 に答える