类比可能会有所帮助。
您有一堆信件需要送到镇上的各个地址。所以你雇了一个骑摩托车的人来送你的信。
您所在城镇的交通信号灯是完美的交通信号灯。除非有人在十字路口,否则它们始终是绿色的。
摩托车上的那个人匆匆忙忙地送来一堆信。由于路上没有其他人,所以每盏灯都是绿色的,这太棒了。但是你认为嘿,这可能会更快。我知道,我会再雇一个司机。
问题是**你只有一辆摩托车*。所以现在你的第一个司机骑着摩托车兜了一圈,然后时不时停下、下车,然后第二个司机跑起来、上车、兜兜转转。
这会更快吗? 不,当然不会。这慢。添加更多线程不会使任何事情变得更快。线程不是魔法。如果一个处理器每秒能够执行十亿次操作,那么添加另一个线程并不会突然使每秒另外十亿次操作可用。相反,它窃取来自其他线程的资源。如果摩托车能以每小时 100 英里的速度行驶,那么停下自行车并让另一个司机上车并不能让它更快!显然,平均而言,在此方案中,信件的送达速度并没有提高,它们只是以不同的顺序送达。
好的,那如果你雇两个司机和两辆摩托车呢?现在你有两个处理器,每个处理器一个线程,这样会更快,对吧?不,因为我们忘记了红绿灯。以前,任何时候都只有一辆摩托车高速行驶。现在有两个司机和两辆摩托车,这意味着现在有时其中一辆摩托车必须等待,因为另一辆在十字路口。同样,添加更多线程会减慢您的速度,因为您会花费更多时间来争用锁。添加的处理器越多,情况就越糟糕;你最终会花费越来越多的时间等待红灯,而越来越少的时间花在传递信息上。
添加更多线程可能会导致负可伸缩性,如果这样做会导致锁被争用。线程越多,争用越多,速度越慢。
假设您使引擎更快——现在您拥有更多处理器、更多线程和更快的处理器。这总是让它更快吗?不。它经常没有。提高处理器速度会使多线程程序运行变慢。再次,想想交通。
假设您有一个城市,有数千名司机和 64 辆摩托车,司机都在摩托车之间来回奔跑,一些在十字路口的摩托车挡住了其他摩托车。现在你让所有这些摩托车跑得更快。这有帮助吗?好吧,在现实生活中,当您四处行驶时,您驾驶保时捷的速度是否是本田思域的两倍?当然不是;在城市驾驶的大部分时间里,您堵在路上。
如果你能开得更快,通常你最终会在交通拥堵中等待更长的时间,因为你最终会更快地驶入拥堵。 如果每个人都更快地驶向拥堵,那么拥堵会变得更糟。
多线程性能可能非常违反直觉。如果你想要极高的性能,我建议不要使用多线程解决方案,除非你有一个“令人尴尬的并行”应用程序——也就是说,某些应用程序显然可以抛出多个处理器,比如计算Mandelbrot 设置或进行光线追踪或类似的事情。然后,不要在问题上抛出比处理器更多的线程。但是对于许多应用程序,启动更多线程会减慢您的速度。