Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在进程或线程之间分配工作?_C#_Multithreading_Multiprocessing - Fatal编程技术网

C# 在进程或线程之间分配工作?

C# 在进程或线程之间分配工作?,c#,multithreading,multiprocessing,C#,Multithreading,Multiprocessing,今年夏天我在一家公司实习,我通过了这个项目,这是一个完整的项目。它在大部分时间内都进行计算密集型操作。完成一个小作业大约需要5分钟,和我一起工作的人说,大作业需要4天才能完成。我的工作是想办法让它跑得更快。我的想法是,我可以将输入一分为二,然后将一半传递给两个新的线程或进程。我想知道是否可以得到一些反馈,说明这可能有多有效,以及线程或进程是否是解决问题的方法 欢迎任何投入。 Hunter我要仔细看看在.net4:)中引入的功能,它可能对轻松的加速特别有用 一般来说,由于启动进程的成本很高,因此不

今年夏天我在一家公司实习,我通过了这个项目,这是一个完整的项目。它在大部分时间内都进行计算密集型操作。完成一个小作业大约需要5分钟,和我一起工作的人说,大作业需要4天才能完成。我的工作是想办法让它跑得更快。我的想法是,我可以将输入一分为二,然后将一半传递给两个新的线程或进程。我想知道是否可以得到一些反馈,说明这可能有多有效,以及线程或进程是否是解决问题的方法

欢迎任何投入。 Hunter

我要仔细看看在.net4:)中引入的功能,它可能对轻松的加速特别有用

一般来说,由于启动进程的成本很高,因此不适合拆分为不同的进程(exefiles)。虽然它还有其他优点,比如隔离(如果程序的一部分崩溃),但我认为它们不适用于您的问题

看看——这听起来像是使用它的主要候选问题


至于线程与进程的两难境地:除非有特定的理由使用进程(例如,如果您使用的是无法修复的错误代码,并且您不希望该代码中的严重崩溃导致整个进程崩溃),否则线程是好的。

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


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

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

优化代码的最佳方法始终是对其进行分析,以找出问题所在

有时你会发现,不费吹灰之力,速度就会大幅提高

,和是两个免费的C#分析器,可能值得一试


(当然,关于使用哪种并行化体系结构的其他评论也很到位——只是我更喜欢先进行分析……

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

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

但是,除了运行一个启动多个迷你应用程序的应用程序外,您无法控制创建其他进程……这不会帮助您解决此问题

您需要使用多个线程。在.NET中添加了一个非常酷的库,用于并行编程。我相信它的名称空间是带有并行类的
System.Threading.Tasks
System.Threading


编辑:不过,我绝对建议您考虑一下线性解决方案是否更适合。有时并行解决方案会花费更长的时间。这完全取决于所讨论的问题。

就我个人而言,我会首先投入精力分析应用程序。您可以更好地了解问题所在在尝试修复之前,您可以将此问题整天并行化,但它只会在速度上给您带来线性改进(假设它可以并行化)。但是,如果您能够找出如何将解决方案转换为只需要
O(n)
操作而不是
O(n^2)操作的解决方案
,例如,那么您就中了大奖。我想我要说的是,您不必关注并行化


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

您了解线程和进程之间的区别吗?引入并行化n并没有自动地让事情花费更少的时间。有一些经典的简单的例子,当它实际上使计算速度变慢时。计算是吗?代码已经过分析和优化了吗?为什么不先尝试一下呢?代码是由不再在公司工作的人编写的,所以我自己一直在处理它,似乎没有人是一个工程师我可以告诉我一些函数的作用。而且文档非常糟糕。不过谢谢你的建议。+1,如果工作足够大,可以在多台机器上进行拆分,那么进程并行化是一种可行的方法。考虑到他说有时需要几天的时间,在这种情况下启动一个进程并不会那么昂贵是的,但这一切都取决于他所能得到的并行的粒度。对于一台机器来说,数据并行可能是一种方法,那么当扩展到多台机器时,当然要使用进程并行(除了进程内并行)