2

解決すべき厄介な問題があります。メソッド呼び出しの前と直後にSystem.currentTimeMillis()を使用します。これは、これら2つのステートメント間の経過時間を測定する必要があるためです。

waitingTime = System.currentTimeMillis(); //starts calculating time
bridge.getIn(direction); // tries to enter the bridge   
waitingTime = System.currentTimeMillis() - waitingTime ;// time elapsed

私の懸念は、プログラムを実行するたびに異なる結果が得られることです。

私はこれを手に入れます(これは完璧です):

Generated cars going north: 0 
Generated cars going south: 2

Waiting time for every single car:
==============================================================
A0/South:109ms
A1/South:0ms
==============================================================
Mean waiting time southbound cars : 54ms

それから数秒後、プログラムを再度実行すると、次のようになります(これは間違っています)。

Generated cars going north: 0 
Generated cars going south: 2

Waiting time for every single car:
==============================================================
A0/South:0ms
A1/South:94ms
==============================================================
Mean waiting time southbound cars : 47ms

すべての車の待ち時間が100msを下回ってはならないため、この出力は間違っていると思います。

currentTimeMillis関数に基づく時間計算に実際に影響するものは何ですか?

なぜ異なる結果が得られるのですか?

不思議に思うかもしれません:入力は毎回同じですか?はいと思います。入力パラメータ

は常に同じですが(両方の例)、プログラムはRandomクラスを使用して

与えられたスレッド数。

それが原因ですか?

プログラムに関するいくつかの詳細:

北から南(逆)に向かう車の束は、2車線の道路に沿って移動します。しばらくすると、彼らは橋に到着します。橋は片道のみで、容量に限りがあります。車が橋を通過するのに100msかかります。交通事故は許されません。

どうもありがとう。

4

1 に答える 1

1

出力/結果に問題はありません。OS は現在実行中のプログラムを一時的に中断し、優先度の高いプログラムを実行します。その他の要因も関係しています。したがって、時間の遅れ。プログラムの実行にかかる正確な時間を確認したい場合は、System.nanoTime()時間をナノ秒で返し、N回実行して平均回数をとってみてください(それでも、実行時間が同じままであることは保証できません)

私が意味したのは、以下に示すように何かを試すことです。

 long totalTime=0;
    for(i=0;i<n;i++){ //where n is some value say 3,4,5
         waitingTime = System.nanoTime(); //starts calculating time
         bridge.getIn(direction); // tries to enter the bridge   
         waitingTime = System.nanoTime() - waitingTime ;// time elapsed
         totalTime+=waitingTime;
    }
    long totalTimeInMillis = totalTime/(n*1000);

注: 環境がすべての実行で同じままであることを確認してください。

于 2012-06-25T10:53:17.263 に答える