为什么我们不应该使用过多的线程

总览

有一个普遍的论点,因为我们有很多核心,并且将来还会有更多核心,所以我们必须使用它们。 我们只是需要找到使用它们的最佳方法,而仅仅是因为我们不能意味着我们应该这样做。

我们的目标是什么?

使用多个线程的充分理由是

  • 使用一个线程的性能还不够。
  • 您已对您的应用程序进行了概要分析,以确保没有低落的果实。
  • 多线程可提高吞吐量,延迟或一致性。
此时,当您知道它使您更接近目标时,应该添加一个线程。

使用多个线程的不好理由

仅仅因为我们可以使用更多的线程并不意味着我们应该这样做。 多线程
  • 增加代码的复杂性
  • 还有其他就是要加快应用程序。 L1缓存比L3缓存快10到20倍,并且如果您可以通过优化内存使用和访问来在L1缓存中花费更多的时间,那么与使用插槽中的每个CPU相比,您可以获得更高的性能。
  • 多线程可能会引入细微的,鲜为人知的错误,而单线程代码不会出现这些错误。
  • 多线程增加了同步,更多地使用了不可变对象,而不是回收可变对象。
  • 即使典型性能更好,多线程也往往导致更差的抖动和更差的外壳性能。

简而言之,除非有一些考虑,否则多线程更有可能使程序变慢而不是加速。 两个CPU的速度最多可以快一倍,但如果不小心的话,很容易变慢十倍。 也就是说,您损失的比获得的更多。

一个简单的例子是计算斐波那契数。 这些很容易递归描述并创建许多线程。 因此,斐波那契数的计算通常用作如何使用大量线程的示例。 他们通常不提及的是,您创建的线程数等于答案,即它呈指数增长。 这意味着,虽然在一个循环/线程中进行迭代需要大约4 ms的时间来计算fib(69),但多线程版本将创建数万亿亿个线程,并且如果不崩溃,其花费的时间将比宇宙的寿命还要长。

但是,如果我有闲置的CPU,那是在浪费它们。

如果要使用每个CPU,只需为每个CPU编写一个繁忙的等待线程即可,完成后,每个CPU的使用率都为100%

假设您要从A到B行驶,有时您可以走一条街,有时走四条街会更快。 但是在A和B附近有20条街道,您应该沿着所有20条街道上下走,因为否则它们就没有意义了,对!!

结论

如果您专注于系统工程设计,以便于开发和维护,那么您将需要最简单的解决方案来解决您的问题。 如果那意味着您不使用100%的网络带宽,100%的磁盘空间,100%的内存或100%的CPU,那也许是一件好事。


翻译自: https://www.javacodegeeks.com/2013/11/why-we-shouldnt-use-more-threads-than-we-need-to.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值