与您正在运行的机器相比,不要考虑您需要的线程数。任何时候你有一个进程,线程都是有价值的:
A:有一些非常慢的操作,其余的过程不需要等待。
B:某些函数可以比另一个运行得更快,不需要内联执行。
C: 有很多不依赖于顺序的 I/O 正在进行(Web 服务器)。
这些只是启动线程有意义时的几个明显示例。因此,您启动的线程数更多地取决于代码中弹出的这些场景的数量,而不是您期望运行的架构。事实上,除非您正在运行一个真正需要优化的进程,否则您很可能只能通过与您启动的线程数相比对您的架构进行基准测试来获得几个百分点的额外性能,并且在现代计算机中,这个数字根本不应该有太大变化。
让我们以 I/O 为例,因为它是最受益的场景。假设某个程序需要通过网络与 200 个用户交互。网络 I/O 非常非常慢。比 CPU 慢几千倍。如果我们轮流处理每个用户,我们将浪费数千个处理器周期来等待来自第一个用户的数据。难道我们不能一次处理来自多个用户的信息吗?在这种情况下,由于我们大约有 200 个用户,并且我们知道我们正在等待的数据比我们可以处理的要慢 1000 倍(假设我们对这些数据进行的处理量最少),我们应该启动操作系统允许的尽可能多的线程。
现在,让我们考虑一个 I/O 密集度较低的示例,假设我们有几个函数依次执行,但彼此独立,其中一些可能运行得更快,比如因为一个中有磁盘 I/O,而没有另一个磁盘 I/O。在这种情况下,我们的 I/O 仍然相当快,但我们肯定会浪费处理时间等待磁盘赶上。因此,我们可以启动几个线程,只是为了利用我们的处理能力,并尽量减少浪费的周期。但是,如果我们在操作系统允许的范围内启动尽可能多的线程,我们可能会导致分支预测器等的内存管理问题......在这种情况下启动过多的线程实际上是次优的,并且可能会减慢程序速度。请注意,在此,我从未提及机器有多少核心!并不是说针对不同的架构进行优化是' t 很有价值,但是如果您针对一种架构进行优化,您可能非常接近大多数架构的最佳状态。再次假设您正在处理所有相当现代的处理器。