検索

ホームページ  >  に質問  >  本文

java - 这段代码开了并行为什么变慢了?

开了并行需要17秒左右,把.parallel()去掉后只用5秒左右(i5双核)

public static void main(String[] args)
{
    long start = System.currentTimeMillis();
    long ret = new Random().longs(0, 10)
                        .limit(10000 * 10000)
                        .parallel()
                        .sum();
    long end = System.currentTimeMillis();
    System.out.println(ret);
    System.out.println("takes " + (end - start) + "ms");
    }
}

然后把代码中的stream改成用range而不用random生成随机数流,则是开并行要比不开并行快一倍(300ms:600ms):

public static void main(String[] args)
{
    long start = System.currentTimeMillis();
    long ret = IntStream.range(0, 1000000000)
                        .parallel()
                        .sum();
    long end = System.currentTimeMillis();
    System.out.println(ret);
    System.out.println("takes " + (end - start) + "ms");
    }
}

为什么前一个例子开并行会更慢,是random类的缘故吗?望指教!

高洛峰高洛峰2887日前584

全員に返信(1)返信します

  • 怪我咯

    怪我咯2017-04-17 17:50:22

    並列処理をオンにした後、元の配列をブロックに分割し、各ブロックで累積を実行し、その後、これらの追加の操作に時間がかかります。累算自体は非常に効率的な線形操作です。そのため、並列データが十分に大きくなかったり、パラメータ(タスク数など)が無理に設定されたりした場合、本来の

    ほどの効率は得られません。

    返事
    0
  • キャンセル返事