3

いくつかの小さなプログラムを作成しようとしてマルチスレッドについて学んでいますが、なぜそれがそうなのかよくわからない特定のことを見つけました。

私は 2 つのクラスを持っています。どちらも 20 億までカウントされ、最後にそれを実行するのにかかった時間を出力します。それらは別々のファイルにあります。最初のものは約2秒でそれを行うことができます(それはより速いでしょうが、私はそこで他のこともやっています)、そして新しいスレッド(新しいRunnable())

メインクラスでははるかに遅く、それを行うのに約8秒かかりました.理由を説明できますか? これがコードです。ありがとうございました。

public class First implements Runnable {

private long startTime, endTime;
public static double count = 0;

@Override
public void run() {
    startTime = System.currentTimeMillis();

    for (int count = 0; count <= 2000000000L; count++);

    endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime); //it is done in about 2seconds
  }
 }


public class Threads {

   public static void main(String[] args){

         First f = new First();
         f.run();

     new Thread(new Runnable() {

        @Override
        public void run() {

            long startTime, endTime;
            double count;
            startTime = System.currentTimeMillis();

            for (count = 0; count < 2000000000L; count++)l

            endTime = System.currentTimeMillis();
            System.out.println(endTime - startTime); //about 8 seconds

        }
    }).start();
 }
}

アップデート

問題は 4 行目にあり、変数カウントが double であることに気付きませんでした。10 行目では、 forサイクルでintを使用しました。変数をインクリメントする速度はスレッドとは関係ありません。以下のコメントで述べたように、プリミティブ データ型の問題です。

4

2 に答える 2

5

それはスレッドとは関係ありません。コードを注意深く見てください (ちなみに混乱しています)。最初の例ではint iをループ インデックスとして使用し、2 番目の例では double iをループ インデックスとして使用しています。Double は異なるデータ型であり、一般に int よりもはるかに低速です。

于 2013-05-24T18:21:08.920 に答える
0

1 つの可能性は、2 番目の例では、カウンターが整数ではなく double であるということです。アーキテクチャと特定の操作に応じて、整数と double のパフォーマンスは異なります。値のインクリメントは特殊なケースかもしれませんが、お使いのマシンでは、double のインクリメントが整数のインクリメントよりも遅くなる可能性があります。に置き換えdouble iてみてint i、どのように機能するかを確認してください。

ソース: https://stackoverflow.com/a/2550851/2076603

于 2013-05-24T18:21:22.043 に答える