2016-05-11 5 views
0

を測定する私は、Javaアプリケーションの実行時間を計測について検索したと私はこのコードを取得する:開始と終了の間マルチスレッドJavaアプリケーションの実行時間

long start= System.currentTimeMillis(); 
//TODO 
long stop= System.currentTimeMillis(); 

違いは私に実行時間を与えます。

注:これは実行時間が正確ではないことを認識しています。私は、マルチスレッドとシングルスレッドのアプリケーションを比較する時間が必要です。

私はこのように私のコードを変更する場合:

long start= System.currentTimeMillis(); 
//something... 
Thread t1= new Thread(new blabla(0, 10), "T - 1"); 
t1.start(); 
Thread t2= new Thread(new blabla(10, 20), "T - 2"); 
t2.start(); 
//Consider I've 10 threads like this 
//something more 
long stop = System.currentTimeMillis(); 

10のスレッドが実行されます。彼らが何をするかは関係ありません。 2D配列をランダムに埋めているとしましょう。

ここで、stop-startは私に「全体的な」実行時間を与えますか?またはスレッド自体を測定する必要がありますか?

+0

Javaのどのバージョンを使用しますか? –

答えて

1

スレッドでstart()を呼び出すと同時に実行されるため、マルチスレッドの例では意図したとおりに動作しません。それでは、基本的に起こることは、あなたはすべての10個のスレッドを開始し、あなたがあなたのタスクを完了するのに要する完全なランタイムを測定したい場合は、あなたがする必要がある

long stop = System.currentTimeMillis(); 

と呼ばれる前に、それらのどれもが、実際にその作業を開始しないことが可能です

long start = System.currentTimeMillis(); 

List<Thread> threads = new ArrayList<>(); 

for (int i = 0; i < 10; ++i) { 
    Thread t = new Thread(new blabla(i * 10, (i + 1) * 10), "T - " + (i + 1)); 
    t.start(); 
    threads.add(t); 
} 

// and now wait for all of them to complete 
for (Thread t : threads) { 
    t.join(); 
} 

long stop = System.currentTimeMillis(); 

これだけ作品あなたのスレッドは、実行後に終了した場合(つまり、あなたのblabla実行可能な無限ループか何かで実行されない)ことを注意:すべてのスレッドは、あなたがこのように行う可能性があり、最初の終了するのを待ちます。

ExecutorService(Executors.newFixedThreadPool(10)the Java APIなど)を使用すると、タスクを送信してすべてのタスクの終了を待つことができます。

+0

私は1-5msの結果が間違っているとはかなり確信していました。また、Eclipseのコンソール書き込みも可能です(例:5 ms)。しかし、終了ボタンはまだ利用可能でした。もちろんスレッドが機能していました。今私はあなたの方法を試して、結果は理にかなっています。もちろん私は100%の測定ではありませんが、スレッド数を微調整しても違いがあります。ありがとう。 – Diga

+1

アプリケーションのランタイムを測定する別の方法がありますが、パフォーマンスを単独で測定する場合、つまり専用の 'main()'メソッドを使用する場合にのみ機能します:mainの開始時に開始時刻を保存し、 'System.getRuntime()。addShutdownHook()'を使ってシャットダウンフックを登録します。これは、JVMが終了したときに呼び出され、そこで時間をもう一度とり、開始時間を引いてランタイムをプリントアウトすることができます。 – svenpanko

関連する問題