C# 线程如何节省时间?

C# 线程如何节省时间?,c#,multithreading,process,async-await,C#,Multithreading,Process,Async Await,我正在用C#学习线程。然而,我无法理解线程的哪些方面实际上在提高性能 考虑一个只有一个核心处理器的场景。将任务拆分为多个线程使用相同的进程上下文(共享资源),并且它们同时运行。由于线程只是共享时间,为什么它们的运行时间(周转时间)比单线程进程要短?需要注意的是,线程本身并不会使进程更快—有时,竞争同一进程会增加必要的运行时间,而不是减少运行时间。一个好的评估是,您想要的场景是否会从多线程中获益 线程的基本要点是使用可用资源进行多任务处理——正如KooKiz所指出的,这与在可用时使用剩余的CPU时

我正在用C#学习线程。然而,我无法理解线程的哪些方面实际上在提高性能


考虑一个只有一个核心处理器的场景。将任务拆分为多个线程使用相同的进程上下文(共享资源),并且它们同时运行。由于线程只是共享时间,为什么它们的运行时间(周转时间)比单线程进程要短?

需要注意的是,线程本身并不会使进程更快—有时,竞争同一进程会增加必要的运行时间,而不是减少运行时间。一个好的评估是,您想要的场景是否会从多线程中获益

线程的基本要点是使用可用资源进行多任务处理——正如KooKiz所指出的,这与在可用时使用剩余的CPU时间非常相似。但你是对的,在某些情况下,线程的使用并不能改善运行时


然而,即使对于单核系统,也存在多线程可以提高性能的实例。当一个进程正在等待某个东西时,它不会锁定任何其他同时运行的进程。根据等待时间的长短,您的单个内核可以在其他独立进程之间切换,以节省时间。

您的大多数评论都是正确的,但我也会抛出我的两分钱(并在此处列出评论):


Jonesy:“线程在多核环境中是最有效的”->是的,但这是一个单核cpu…所以我将回到这里

KooKiz和John Sibly:他们都提到了I/O。您的机器没有100%的时间以全功率运转。有相当多的其他事情需要花费时间,在这些事件中,您的CPU需要休息

(参考点:I/O可以是网络传输、硬盘/RAM读取、SQL查询等。任何将新数据引入CPU或从CPU卸载数据的操作)

这些休息时间是您的cpu可以做其他事情的时间。如果您有一个单核cpu(我们现在将忽略超线程),和一个单线程应用程序,那么它可以很好地运行。然而,它并不是持续运行的。CPU调度会给它一个或两个周期,然后转移到其他地方,然后在一段时间后返回到您的程序,再给它几个周期,继续等等。这会给人一种错觉,即能够在单个核心CPU上“同时做多件事”

现在,因为这是一个普通的程序,而不是一个非常小的汇编程序,你直接将值写入缓存,所以你的程序将数据存储在RAM中……与CPU缓存相比,RAM是一个相对较慢的存储介质。因此,加载值需要时间

在此期间,您的CPU可能没有更好的事情要做。在这里,您可以看到多线程应用程序的加速,即使是单核应用程序。另一个线程将填充这些额外的CPU周期,否则CPU将处于空闲状态

请注意,您不太可能看到2:1的加速。如果这样的话,您的双线程程序很可能只会看到10-20%的速度提升。请记住,“其他”线程(在任何给定点上都是不执行I/O的线程)只有在第一个线程执行I/O时才真正以其全部容量运行

然而,通常情况下,你会看到更糟糕的时刻。这是因为您的CPU现在必须花费更多的时间在进程中的线程之间切换(请记住,我们一次只能运行一件事情!)。这称为开销。第二个线程产生的开销超过了它所能弥补的,因此整个进程的速度会减慢

在多核机器上,您有两个物理执行器…这意味着第二个线程将获得一个全新的内核。这意味着它不必为执行时间与其他很多东西竞争。因此,我们在这里得到了很大的加速


当然,您有在集群上执行的多进程程序,但我们将把它保存到另一个时间。

在单核CPU中,您获得的优势是异步。使用线程是实现这一点的一种方法(尽管不是唯一的方法)

想象一下做饭的过程。你认为哪一个更快:

  • 开始烧开水。等它结束
  • 加些面条。等他们吃完
  • 洗/准备一些蔬菜
  • 炒蔬菜
  • 放在盘子里上菜
  • 或者:

  • 开始烧开水
  • 开水时,洗/准备一些蔬菜
  • 在沸水锅里加入一些面条
  • 煮面条时把蔬菜炒一下
  • 放在盘子里上菜
  • 根据我的经验,第二个更快

    这里的一般想法是,在许多情况下,当编程时,您将有一个需要一些时间的操作,但它不需要CPU的工作才能完成。一个常见的例子是IO。当您向数据库发送请求以获取一些信息时,在等待该请求返回时,通常会有其他事情需要您做。也许您可以发送几个请求,然后等待它们完成,而不是启动一个请求,等待它,然后启动下一个请求,等待等等(尽管有时您必须执行后一个请求)

    现在,如果您需要做的工作是CPU限制的工作,那么只有当您的CPU上有多个内核时,您才能真正从线程中获得好处,从而使工作实际上可以并行完成,而不仅仅是异步完成。例如,许多与图形相关的工作(举一个简单的例子,乘以矩阵)通常需要做很多基础数学。如果您有多个内核,这些操作通常可以很好地扩展。如果你不