在进程或线程之间划分工作?

时间:2011-06-09 14:13:42

标签: c# multithreading multiprocessing

今年夏天我正在为一家公司实习,而且我已经通过了这个项目,这是一个完整的部分。它在大部分时间内进行非常计算密集的操作。在一份小工作上完成一次运行需要大约5分钟,与我合作的人说,较大的工作需要4天才能运行。我的工作是找到一种方法让它更快。我的想法是,我可以将输入分成两半并将两半传递给两个新的线程或进程,我想知道我是否可以得到一些关于效率如何以及线程或进程是否可行的反馈。

欢迎任何投入。 猎人

8 个答案:

答案 0 :(得分:3)

我会强烈关注.net4中引入的TPLPLINQ可能对轻松加速特别有用。

一般来说,由于启动过程很昂贵,因此不能分成不同的进程(exefiles)。它确实有其他优点,如隔离(如果程序的一部分崩溃),但我不认为它们适用于您的问题。

答案 1 :(得分:2)

如果作业是可拆分的,那么进行多线程/多处理将带来更好的速度。当然,这是假设他们运行的计算机实际上有多个核心/ cpus。

线程或进程在速度方面并不重要(如果线程不共享数据)。使用我所知道的进程的唯一原因是作业可能会崩溃整个进程,这在.NET中是不可能的。

答案 2 :(得分:2)

如果您的代码中存在大量内存共享但是如果您认为您希望将程序扩展为跨多台计算机运行(当需要核心> 16时),则使用线程,然后使用具有客户端/服务器模型的进程开发它

答案 3 :(得分:1)

看看Task Parallel Library - 这听起来像是使用它的主要候选问题。

至于线程与进程的困境:线程很好,除非有特定的理由使用进程(例如,如果你使用了无法修复的错误代码,并且你不希望代码中的错误崩溃打倒你的整个过程。)

答案 4 :(得分:1)

在优化代码时,最好的方法是对其进行分析,以找出Logjam的IMO位置。

有时你可以毫不费力地发现非显着的速度提升。

EqatecSlimTune是两个免费的C#个人资料,可能值得一试。

(当然关于使用哪种并行化架构的其他评论都是正确的 - 我只是首先选择分析....

答案 5 :(得分:1)

如果问题有并行解决方案,那么这是(理想情况下)显着(但不总是)提高性能的正确方法。

但是,除了运行启动多个迷你应用程序的应用程序之外,您无法控制其他进程...这对您无法解决此问题。

您将需要使用多个线程。 .NET中添加了一个非常酷的库,用于并行编程,你应该看一下。我相信它的名称空间是System.Threading.TasksSystem.Threading与Parallel类。

编辑:我肯定会建议您考虑线性解决方案是否更适合。有时并行解决方案会花费更长时间。这一切都取决于有问题的问题。

答案 6 :(得分:0)

如果您需要通信/传递数据,请使用线程(如果您可以使用.Net 4,请使用其他人建议的任务并行库)。如果您不需要传递那么多信息,我建议进程(在多个核心上扩展得更好,您可以在客户端/服务器设置中执行多台计算机[服务器将信息传递给客户端并获得响应,但是除了没有多少信息传递]等。)。

答案 7 :(得分:0)

就个人而言,我会先投入精力分析应用程序。在尝试修复之前,您可以更好地了解问题所在的位置。您可以整天并行处理此问题,但它只会使您的速度线性提高(假设它可以完全并行化)。但是,如果您可以弄清楚如何将解决方案转换为仅采用O(n)操作而不是O(n^2)的操作,那么您就可以获得累积奖金。我想我所说的是你不一定要专注于并行化。

您可能会发现在集合中循环的点以查找特定项目。相反,您可以将这些循环转换为哈希表查找。您可能会发现经常排序的斑点。相反,您可以将这些频繁的排序操作转换为单个二进制搜索树(SortedDictionary),该树通过许多添加/删除操作有效地维护已排序的集合。也许你会发现重复进行相同计算的斑点。您可以缓存已经进行的计算的结果,并在必要时稍后查找。