【问题标题】:Will using threads save time?使用线程会节省时间吗?
【发布时间】:2011-10-12 01:35:57
【问题描述】:

当用户将项目文件加载到我的应用程序中时,可能需要很长时间 - 几十秒。我理解使用后台线程来处理阻塞 UI 的东西的概念。但是,在这种情况下,用户无需执行任何操作 - 他们正在等待项目文件加载 - 除了观看进度消息。

我正在考虑在不同线程之间分配不同项目元素的处理。但是,我完全不清楚这是否真的会产生有价值的改变。一些项目元素在创建过程中确实花费了更多时间,但通常复杂的数量很少,简单的数量很多。处理涉及创建一些绘图代码,以便元素可以显示在画布上。

我了解线程之间时间切片的概念,但据我所知,总时间没有改变,使用线程可能会有一些开销。

我也明白,对于多核处理器,如果线程分布在处理器之间,则可能会发生一些真正的并发(抱歉,我对线程的了解不够,无法知道这是否正确描述)。我不知道这是否容易安排。显然,这对使用单核处理器的用户没有帮助。

更改代码以进行尝试并非易事,因此我会听取您的意见,看看这是否值得尝试。

谢谢。

【问题讨论】:

  • 我会分析代码并考虑提高它的性能,使其首先保持单线程。并且只有在失败的情况下才考虑使其成为多线程。
  • 我知道这不是你问的,但你可能想看看在你的应用程序中加快项目加载时间的可能方法。它可能是比多线程解决问题更好、更容易的方法。
  • 谢谢伙计们,我确实使用分析器并寻找使其更快的方法。不幸的是,我认为我已经到了改进的尽头
  • 什么需要更长的时间,从磁盘加载数据或将其处理成可用的形式?如果加载需要更长的时间,线程将无法帮助您更快地加载它。您可以做的最好的事情是让一个线程将数据加载到内存中,而第二个线程在数据可用时对其进行处理。这样,可以在处理第一组数据的同时加载第二组数据,从而最大限度地缩短处理第一组和第二组数据之间的时间。

标签: c# .net multithreading


【解决方案1】:

添加多线程本身并不会使事情变得更快。如果多个线程最终争夺共享资源,程序很可能最终会运行(非常)慢。

【讨论】:

    【解决方案2】:

    你说你有很多东西,有些小,有些大。那么,多线程可以帮助用户感觉到事情进展得更快。另外,就像您说的那样,多核处理器可能会受益(只要您的处理器亲和力是默认设置,它应该可以正常工作)。大多数人今天可能会购买多核计算机,而在未来,您应该期望所有计算机都是多核的。

    【讨论】:

      【解决方案3】:

      如果可以将耗时的任务分成更小的独立任务,那么在多个线程上运行这些任务会更快,因为您可以并行执行。如果您使用的是 .NET 4.0,我建议您查看内置的 TPL library

      线程的最大问题是能够将您的算法划分为可以并行和独立执行的较小部分。这样,您将获得性能的净收益。但不幸的是,并非所有算法都可以并行化。在这种情况下,只需在后台线程上运行整个操作即可避免冻结主 UI。这样做你不会获得任何速度,你的应用程序也不会加载得更快,但至少用户不会在他的窗口标题栏中得到 Not Responding 并且你将能够显示一些进度指示器.

      【讨论】:

      • 只要您有多个 CPU/内核或超线程 CPU,它会更快。
      • @Pace:如果你有线程阻塞资源(磁盘 I/O、网络流量等),它实际上也可以加快单核 CPU 上的速度
      【解决方案4】:

      通常,多线程加载过程不会节省时间,因为该过程通常需要按特定顺序完成任务,直到前面的部分完成后才能处理后面的方面。这在很大程度上取决于您的实际加载过程。由于核心 .net 进程,加载也可能需要一些时间。在这两种情况下,线程都不会产生重大影响。

      您必须考虑的是任务的重要部分是否明显彼此无关。只有在这种情况下,它可能会更快,但你只会把更快的过程的速度赶出时间。并且通过在任何显着程度上添加线程,您很有可能会减慢处理速度,因为这段代码是有代价的。

      您可能会更好地考虑是否可以延迟加载项目的某些方面 - 在开始时可能并不总是需要的任何内容都可能会延迟。甚至,根据处理结构,您是否可以在完成加载之前将控制权返回给用户,这会在后台继续进行。这并没有让它变得更快,但确实给人一种更快的印象。

      【讨论】:

        【解决方案5】:

        为什么不试试呢?承担最大、最重的文件负载,将其关闭,看看会发生什么。在某些情况下,卸载负载可以更快,例如。 @TMN 需要通过网络加载大量小文件的情况 - 通过高延迟网络建立连接以传输小文件可能比传输文件数据需要更长的时间。在这种情况下,即使是单核机器也会显示出很大的加速。

        Rgds, 马丁

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-22
          • 2017-11-26
          • 2021-12-05
          • 2015-11-15
          • 2018-01-27
          • 2016-07-04
          • 1970-01-01
          • 2011-01-03
          相关资源
          最近更新 更多