响应时间随着Java中并发性的增加而增加

时间:2015-06-25 19:25:16

标签: java multithreading recursion concurrency

我编写了一个独立的java程序,它涉及一个被称为至​​少6万次的递归函数。现在,当我将这个java程序作为单个线程运行时,大约需要2秒钟。然而,当我生成25个并行线程时,响应时间增加到10秒,其中每个线程同时开始并且在10-15秒之后也大致同时结束。

我运行了探查器工具(jvisualvm)来检查正在进行的任何线程是否有任何锁定但是所有25都始终处于运行状态。

因此我的问题是: 1.在并发响应中,时间可能会增加(取决于系统上的内核),但是如果假设运行测试的机器是6核机器,那么至少6个线程应该在至少2秒或更多时间内完成?并非所有人都应该同时完成处理,即。 10秒后? 2.如何检测并行处理中导致问题的是什么?

赞赏同样的回应。

谢谢。

3 个答案:

答案 0 :(得分:3)

  

在并发响应中,时间可能会增加(取决于系统上的内核),但是如果假设运行测试的机器是6核机器,那么至少6个线程应该至少在2秒或更多时间内完成?

从理论上讲,这是可能的,但这完全取决于你在做什么。如果你受CPU限制并且你遇到了自然并行的问题,你可以用6个代码获得6倍的改进。如果您有一个网络IO绑定进程,那么只有6个内核可以使100个线程快100倍。但是,如果你有一个开销太高的任务,你可以使用多个线程比使用一个更慢的数量级。

  

并非所有人都应该同时完成处理,即。 10秒后?

这种可能性很小,但可能。

  

如何检测并行处理中导致问题的是什么?

使用多个线程时,它比一个线程慢。我建议你看看你是如何解决问题的,并确保你没有比有用的工作更多的头脑。

答案 1 :(得分:0)

这是一个非常广泛的问题。所以我要给出一个相当广泛的答案。

  
      
  1. 在并发响应中,时间可能会增加(取决于系统上的核心),但是如果假设运行测试的机器是6核机器,那么至少6个线程应该在至少2秒或更多时间内完成?
  2.   

完全取决于所做工作的类型。对于N个核心,N个线程的创建涉及非平凡的开销,以及管理核心之间的IO的父进程。多线程可能有帮助或有害。如果您有执行大量off-cpu IO的任务,或者对线程之间未共享的数据进行长时间运行计算,则多线程通常是一个不错的选择。

  
      
  1. 如何检测并行处理中导致问题的原因是什么?
  2.   

这可能很棘手。使用一个好的调试器,暂停点上的所有线程。在线程之间寻找许多共享资源,过度/不必要的同步或长等待时间。有很多可能的原因。

答案 2 :(得分:0)

通过预热线程改善了我的响应时间。线程创建花了很多时间,当我们在app服务器(如tomcat)中运行代码时,它会得到改善

另一个值得注意的特性是在第一次运行之后,第二次运行速度较慢,这让我相信JVM在运行时加载类的方式(除了线程预热)

感谢大家的投入