c# - 线程与单线程

标签 c# .net multithreading cpu

是否总能保证多线程应用程序比单线程应用程序运行得更快?

我有两个线程从数据源填充数据,但实体不同(例如:数据库,来自两个不同的表),应用程序的单线程版本似乎比具有两个线程的版本运行得更快。

为什么会这样?当我查看性能监视器时,两个 cpu 都非常尖?这是由于上下文切换吗?

提升 CPU 并充分利用它的最佳做法是什么?

我希望这不是模棱两可的。

最佳答案

类比可能会有所帮助。

您有一堆信件需要递送到镇上的各个地址。所以你雇了一个骑摩托车的人来送你的信。

您镇上的交通信号灯是完美的交通信号灯。除非十字路口有人,否则它们始终是绿色的。

摩托车上的那个人飞快地送来一堆信件。由于路上没有其他人,所以每盏灯都是绿色的,真棒。但是你认为嘿,这可能会更快。我知道,我会再雇一个司机。

问题是**你只有一辆摩托车*。所以现在你的第一个司机骑着摩托车转了一圈,然后不时停下来,下车,第二个司机跑上去,跳上摩托车,转了一圈。

这会更快吗? 不,当然不是。那是。添加更多线程并不能使任何事情变得更快。线程不是魔法。如果一个处理器每秒能够执行十亿次操作,那么添加另一个线程不会突然使每秒另外十亿次操作可用。相反,它从其他线程窃取 资源。如果一辆摩托车能以每小时 100 英里的速度行驶,停下自行车并让另一个司机上车并不能使它更快!显然,平均而言,在该方案中,信件的递送速度没有任何加快,它们只是以不同的顺序递送。

好吧,那如果你雇两个司机和两辆摩托车呢?现在你有两个处理器,每个处理器一个线程,这样会更快,对吧?不,因为我们忘记了红绿灯。以前,任何时候都只有一辆摩托车在高速行驶。现在有两个司机和两辆摩托车,这意味着现在有时其中一辆摩托车将不得不等待,因为另一辆在十字路口。同样,添加更多线程会减慢您的速度,因为您会花更多时间争用锁。添加的处理器越多,情况就越糟;您最终花在等红灯上的时间越来越多,而发送消息的时间越来越少。

添加更多线程可能导致负面可伸缩性,如果这样做会导致锁被争用。线程越多,争用越多,运行速度越慢。

假设您使引擎更快 - 现在您拥有更多处理器、更多线程和更快的处理器。这总是让它更快吗?不。它经常没有。提高处理器速度可以使多线程程序运行得更慢。再次,想想交通。

假设您有一个城市,有数千名司机和 64 辆摩托车,司机都在摩托车之间来回奔跑,一些摩托车在十字路口挡住了其他摩托车。现在你让所有的摩托车跑得更快。这有帮助吗?那么,在现实生活中,当您四处行驶时,您驾驶保时捷到达目的地的速度是驾驶本田思域的两倍吗?当然不是;在城市驾驶的大部分时间里,您都堵在路上

如果您可以开得更快,通常您会在交通中等待更长的时间,因为您最终会更快地驶入拥堵。 如果每个人都更快地驶向拥堵,那么拥堵会变得更糟

多线程性能可能非常违反直觉。如果你想要极高的性能,我建议不要使用多线程解决方案,除非你有一个“并行得令人尴尬”的应用程序——也就是说,一些应用程序显然可以使用多个处理器,比如计算Mandelbrot 设置或进行光线追踪或类似的事情。然后,不要在问题上投入比处理器更多的线程。但是对于许多应用程序,启动更多线程会降低速度

关于c# - 线程与单线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2902264/

相关文章:

python - 延迟调用函数

c# - 出错时重试异步文件上传

c# - 设置数据绑定(bind)后如何向列表框添加内容?

c# - 从 ReadAsStreamAsync 传递 Stream 作为 API 响应并避免大内存对象

c# - .NET 内存即使在退出函数后也没有释放

c# - 如何拦截对 .NET 程序中文件的访问

c++ - 原子比较运算符(无交换)

java - 从 Java 中的不同线程更新 GUI 的非马虎设计模式

c# - 如何在 GridView 中获取主键但不显示它?

c# - 从其他线程更改按钮颜色