单核上的 C# 并行和多线程 cpu
C# parallel and multithreading on single core cpu
我有一个使用 C# 和 .net 4.5 的应用程序,它在 windows 8.1 的英特尔酷睿 i5 系统上运行,但是当我发布该应用程序并在 windows 7 SP1 上安装时 运行 在带有 .net 4.5.3 应用程序的 Intel Pentium 4 单核和单线程系统上无法完全工作。
我猜导致此问题的代码部分使用了 Parallel.Foreach .
我的应用程序也使用异步等待。
Parallel.Foreach 和 async await 只在多线程处理器上工作是真的吗?
如何在单核上使用这个程序?如果需要替换代码我应该使用什么?
Parallel.Foreach 使用的 TPL 与线程而不是核心一起工作,由 OS 来安排这些线程。单核处理器将简单地 运行 与 Parallel.Foreach 代码关联的线程通过单核而不会出现问题。另一方面,Async/await 方法不会显式创建额外的线程,而是 运行 在当前同步上下文上,并且仅在方法处于活动状态时才在线程上使用时间。同样,单核 CPU 应该可以毫无问题地处理 async/await。
也就是说,由于与线程 creation/management 相关的额外开销,使用 Parallel.Foreach 实际上可能会降低性能。如果代码未 CPU 绑定,Parallel.Foreach 并不是最好的方法。
我希望我没有因为挖掘这个而受到抨击,但我只是在学习 Parallel.ForEach 并且想知道它在单核机器上的表现如何。
对于将来也可能研究此问题的任何人,我会说尝试使用可以像这样传递给 ForEach 方法的 ParallelOptions class 的 MaxDegreeOfParallelism 属性 :
void DoSomethingParallel()
{
ParallelOptions parOpts = new ParallelOptions();
parOpts.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
object[] objs = new object[10];
Parallel.ForEach(objs, parOpts, currObj =>
{
Console.WriteLine("This is the current object: {0}", currObj.ToString());
});
}
如果这不能解决问题,我们深表歉意。我还没试过。
@JTW 回答得很好,我还要补充以下内容:
如果系统只有一个处理器,将程序转换为使用 multi-threaded 实现不会提高数据处理速度。这是在 CPU 绑定 程序的情况下。例如。特定数据集的数值分析。此外,程序不会抛出异常。
但是,考虑一个不断与文件系统交互的程序。此应用程序是 IO (input/output) bound,因为它可以工作的速率由文件的性能决定系统。 multi-threaded 解决方案将能够在一个任务等待 input/output 操作完成时执行处理。
PS。我知道我晚了一年才加入这个话题,但希望它能对某人有所帮助。
我有一个使用 C# 和 .net 4.5 的应用程序,它在 windows 8.1 的英特尔酷睿 i5 系统上运行,但是当我发布该应用程序并在 windows 7 SP1 上安装时 运行 在带有 .net 4.5.3 应用程序的 Intel Pentium 4 单核和单线程系统上无法完全工作。 我猜导致此问题的代码部分使用了 Parallel.Foreach .
我的应用程序也使用异步等待。
Parallel.Foreach 和 async await 只在多线程处理器上工作是真的吗?
如何在单核上使用这个程序?如果需要替换代码我应该使用什么?
Parallel.Foreach 使用的 TPL 与线程而不是核心一起工作,由 OS 来安排这些线程。单核处理器将简单地 运行 与 Parallel.Foreach 代码关联的线程通过单核而不会出现问题。另一方面,Async/await 方法不会显式创建额外的线程,而是 运行 在当前同步上下文上,并且仅在方法处于活动状态时才在线程上使用时间。同样,单核 CPU 应该可以毫无问题地处理 async/await。
也就是说,由于与线程 creation/management 相关的额外开销,使用 Parallel.Foreach 实际上可能会降低性能。如果代码未 CPU 绑定,Parallel.Foreach 并不是最好的方法。
我希望我没有因为挖掘这个而受到抨击,但我只是在学习 Parallel.ForEach 并且想知道它在单核机器上的表现如何。
对于将来也可能研究此问题的任何人,我会说尝试使用可以像这样传递给 ForEach 方法的 ParallelOptions class 的 MaxDegreeOfParallelism 属性 :
void DoSomethingParallel()
{
ParallelOptions parOpts = new ParallelOptions();
parOpts.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
object[] objs = new object[10];
Parallel.ForEach(objs, parOpts, currObj =>
{
Console.WriteLine("This is the current object: {0}", currObj.ToString());
});
}
如果这不能解决问题,我们深表歉意。我还没试过。
@JTW 回答得很好,我还要补充以下内容:
如果系统只有一个处理器,将程序转换为使用 multi-threaded 实现不会提高数据处理速度。这是在 CPU 绑定 程序的情况下。例如。特定数据集的数值分析。此外,程序不会抛出异常。
但是,考虑一个不断与文件系统交互的程序。此应用程序是 IO (input/output) bound,因为它可以工作的速率由文件的性能决定系统。 multi-threaded 解决方案将能够在一个任务等待 input/output 操作完成时执行处理。
PS。我知道我晚了一年才加入这个话题,但希望它能对某人有所帮助。