当前位置: 首页 > 知识库问答 >
问题:

并行流要比java中的流花费更多的时间[duplicate]

颜光临
2023-03-14

我在学习java stream api时在代码中发现了这个问题。

这是我的代码

 long s = System.currentTimeMillis();
 IntStream.range(1, 10).parallel().forEach( x ->{
      System.out.println( "Thread -> "+ Thread.currentThread().getName() +" "+ x );
 });
 long e = System.currentTimeMillis();
 System.out.println("Time taken "+ (e-s) + " ms");

 System.out.println("---------------------");

 s = System.currentTimeMillis();
 IntStream.range(1, 10).forEach( x ->{
     System.out.println( "Thread -> "+ Thread.currentThread().getName() +" "+ x );
 });
 e = System.currentTimeMillis();
 System.out.println("Time taken "+ (e-s) + " ms");
Thread -> main 6
Thread -> ForkJoinPool.commonPool-worker-7 2
Thread -> ForkJoinPool.commonPool-worker-7 5
Thread -> ForkJoinPool.commonPool-worker-13 1
Thread -> ForkJoinPool.commonPool-worker-11 4
Thread -> ForkJoinPool.commonPool-worker-3 3
Thread -> ForkJoinPool.commonPool-worker-15 9
Thread -> ForkJoinPool.commonPool-worker-9 7
Thread -> ForkJoinPool.commonPool-worker-5 8
Time taken using parallel stream 29 ms
-------------------------------------
Thread -> main 1
Thread -> main 2
Thread -> main 3
Thread -> main 4
Thread -> main 5
Thread -> main 6
Thread -> main 7
Thread -> main 8
Thread -> main 9
Time taken simple stream 1 ms

我在sts和inteliJ IDE上试用了这段代码,结果都是一样的。并行比顺序需要更长的时间。我的JDK有问题吗?请建议。

共有1个答案

督飞羽
2023-03-14

首先,做这种标杆是辛苦的。在代码执行期间执行各种优化。但在这种情况下,当基准本会是好的时,我不会期望有多大不同的结果。

首先,并行化会造成开销。您需要启动和停止线程,有时在某些点上同步线程,在线程之间进行通信,等等。所以通常只有在有很多元素要处理的情况下,才是值得的,而且需要为每个元素做的工作是非常重要的。在你的情况下,这两个都不是真的。

其次,您正在输出到标准输出。System.out将只允许一个线程同时输出某些内容。这样做是为了在多个线程尝试写入标准输出时,输出不会被过多打乱。这意味着在您的情况下,所有线程基本上都将花费大量时间等待轮到它们编写。

所以,不,您的JVM没有问题。

 类似资料:
  • 问题内容: 我正在使用Java 8的流,无法理解我得到的性能结果。我有2个核心CPU(Intel i73520M),Windows 8 x64和64位Java 8 Update5。我正在对String的流/并行流进行简单映射,发现并行版本要慢一些。 考虑到我有2个CPU内核,并行版本是否应该更快?有人可以提示我为什么并行版本比较慢吗? 问题答案: 确实有几个并行发生的问题。 首先是并行解决问题总是

  • 问题内容: 我想保存一个或数组。 我尝试与和一起使用,发现前者总是花费更少的时间。 我的实际数据要大得多,但在这里我仅展示一小段用于演示目的: 输出: 我的实际大小(字典中约有100,000个键)时差更加明显。 为什么在保存和加载时,泡菜比np.save花费的时间更长? 我什么时候应该使用? 问题答案: 因为只要书面对象不包含Python数据, numpy对象在内存中的表示方式比Python对象简

  • 我在本地文件系统中有24GB文件夹。我的任务是将该文件夹移动到HDFS。我有两种方法。1)hdfs dfs-复制来自本地 /home/data/ /home/ 这大约需要 15 分钟才能完成。 2)使用水槽。 这是我的经纪人 这一步花了将近一个小时将数据推送到HDFS。 据我所知,Flume是分布式的,所以Flume加载数据的速度应该比copyFromLocal命令更快。

  • 问题内容: 我已经阅读了许多示例,并最终使用以下代码从Java程序内部执行了命令行命令。 我已经用一个简单的ls命令测试了它,并且工作正常。当我尝试运行另一个命令时,它将永远耗费时间(保持运行25分钟,但尚未停止)。 当我在命令行上执行tabix命令时,我得到以下统计信息 4.173u 0.012s 0:04.22 99.0%0 + 0k 0 + 0io 0pf + 0w 因此,它应该很快完成。

  • 考虑到我有2个CPU核心的事实,并行版本不是应该更快吗?有人能给我一个提示为什么并行版本比较慢吗?