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