使用线程会节省时间吗?

时间:2011-07-24 15:13:44

标签: c# .net multithreading

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

我正在寻找在不同线程之间分配不同项目元素的处理。但是,如果这真的会产生有价值的差异,我一点也不清楚。一些项目元素确实在创建时消耗了更多的时间,但通常复杂的项目元素数量很少而且简单的元素数量很多。处理涉及创建一些绘图代码,以便元素可以显示在画布上。

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

我也明白,对于多核处理器,如果线程在处理器之间分配,那么可能会发生一些真正的并发(抱歉,我不太了解线程以了解这是否是正确的描述)。我不知道这是否易于安排。显然,对于使用单核处理器的用户来说,它无济于事。

更改代码以尝试它并不是一项简单的任务,所以我会就是否值得尝试来看待你的意见。

感谢。

5 个答案:

答案 0 :(得分:4)

添加多线程并不会让事情变得更快。如果多个线程最终竞争共享资源,那么该程序很可能最终运行得更慢。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你说你有很多物体,有些小,有些大。多线程可以帮助用户感觉事情进展得更快。另外,就像你说的那样,多核处理器可能会看到好处(只要你的处理器关联是默认的,它应该工作正常)。大多数人今天可能会购买多核计算机,并且在未来,您应该期望所有计算机都是多核计算机。

答案 3 :(得分:1)

通常,多线程加载过程不会节省时间,因为过程通常需要按特定顺序完成,以后的方面直到先前的方法才能处理。这在很大程度上取决于您的实际装载过程。由于核心.net进程,加载也需要时间。在任何一种情况下,线程都不会产生显着差异。

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

如果你可以懒得加载项目的某些方面,你可能会做得更好 - 开始时可能并不总是需要的东西可能会推迟。或者甚至,根据处理结构,您是否可以在完成加载之前将控制权返回给用户,这在后台继续。这不会使它更快,但确实给人一种更快的印象。

答案 4 :(得分:0)

为什么不尝试一下?获取最大,最重的文件负载,将其断开并查看会发生什么。有些场景可以更快地线程化负载,例如。 @TMN需要通过网络加载大量小文件的情况 - 通过高延迟网络建立连接以传输小文件可能比传输文件数据花费更长的时间。在这种情况下,即使是单核盒也会显示出很大的加速。

RGDS, 马丁