进程比线程更多资源
总览
有一个普遍的论点,因为我们有很多核心,并且将来还会有更多核心,所以我们必须使用它们。 我们只是需要找到使用它们的最佳方法,而仅仅是因为我们不能意味着我们应该这样做。
我们的目标是什么?
使用多个线程的充分理由是
- 使用一个线程的性能还不够。
- 您已对应用程序进行了概要分析,以确保不会有低落的果实。
- 多线程可提高吞吐量,延迟或一致性。
使用多个线程的不好理由
- 增加代码的复杂性
- 还有其他就是要加快应用程序。 L1缓存比L3缓存快10到20倍,如果您可以通过优化内存使用和访问来在L1缓存中花费更多的时间,则与使用插槽中的每个CPU相比,您可以获得更高的性能。
- 多线程可能会引入细微的,鲜为人知的错误,而单线程代码根本不会出现这些错误。
- 多线程增加了同步,更多地使用了不可变对象,而不是回收可变对象。
- 即使典型性能更好,多线程也往往导致更差的抖动和更糟的性能。
简而言之,除非有人考虑,否则多线程更有可能使程序变慢而不是加速。 两个CPU的速度最多可以快一倍,但如果不小心的话,很容易变慢十倍。 也就是说,您损失的比获得的更多。
一个简单的例子是计算斐波纳契数。 这些很容易递归地描述并创建许多线程。 因此,斐波那契数的计算通常用作如何使用大量线程的示例。 他们经常没有提到的是,您创建的线程数等于答案,即它呈指数增长。 这意味着,虽然在一个循环/线程中进行迭代大约需要4毫秒来计算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
进程比线程更多资源