3

作成したアプリケーションの各スレッドを実行するのにかかる時間を計測する必要があり、終了して結果が得られましたが、それが正しく行われたことを確認する良い方法が実際にはありません。私は前にこのようなことをしたことがありません。誰かが私に簡単な校正をしてくれるなら、それは非常に役に立ちます.

スレッドを作成するコードは次のとおりです。

for (int i = 0; i < ROWS; i++) {
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "Othello.txt", i, 0));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "HuckFinn.txt", i, 1));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "TomSawyer.txt", i, 2));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "HuckFinn.txt", i, 3));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "TomSawyer.txt", i, 4));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("TomSawyer.txt", "HuckFinn.txt", i, 5));
    threads[threadCount++].start();
}

そして、スレッド自体のコード:

public void run() {

    long start = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

//DO SOME STUFF

    long end = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

    Driver.timeResults[0][row][col] = end - start;
    Driver.results[row][col] = difference;
}
4

2 に答える 2

1

スレッドごとの経過時間または からの「実際の」経過時間のいずれかが必要ですSystem.currentTime()。コードはスレッドごとの時間を取得しますが、これは実際の経過時間と常に同じになるとは限りません。それが意図したものである場合、実装は機能するはずです。

タイミング動作を確認する簡単な方法は、既知の期間でタスクを実行することです。 Thread.sleep()、 例えば。Thread.sleep()ビジー待機 (つまり)と比較してみてくださいwhile(System.currentTimeMillis() < timeInTheFuture) {}。CPU 時間が異なる可能性が高いことに気付くでしょう。高精度は期待できませんが、仮定を検証するために使用することはできます。それぞれが 30 秒間動作する 5 つのスレッドを起動すると、スレッドごとに最大 30 秒戻りますか? その後、それはあなたが期待することをしています。

とはいえ、タイミング情報を配列に格納しているように見えますが、これは良い考えではありません。 配列はスレッドセーフではありません。あなたの場合、ConcurrentHashMap<String, Long>キーがスレッド名である場所を作成するのがおそらく最も簡単でしょう。

timeResults.put(Thread.currentThread().getName(), end - start);
于 2015-09-23T22:30:43.873 に答える
0

CPU ごとに各スレッドで費やされた時間を測定したい場合は、はい、コードは正しく見えます。ただし、スレッドの開始から完了までの実際の時間を測定しないことに注意してください。そのためには、 を使用しますSystem.nanoTime()

于 2015-09-23T22:22:04.450 に答える