C# 为什么可以';我的并行任务代码不能达到100%的CPU利用率吗?
手动并行任务代码=10秒时间,仅cpu=25% 并行Linq代码=18秒时间,cpu=100%(仍需18秒) 没有并行的Linq代码:14秒,仅cpu=25% 为什么会这样?当我同时启动4个线程时,为什么我的cpu利用率没有达到100%?这与非并行代码(只有一个线程)中的代码相比仅为25%。我是否真的并行运行4个线程C# 为什么可以';我的并行任务代码不能达到100%的CPU利用率吗?,c#,multithreading,C#,Multithreading,手动并行任务代码=10秒时间,仅cpu=25% 并行Linq代码=18秒时间,cpu=100%(仍需18秒) 没有并行的Linq代码:14秒,仅cpu=25% 为什么会这样?当我同时启动4个线程时,为什么我的cpu利用率没有达到100%?这与非并行代码(只有一个线程)中的代码相比仅为25%。我是否真的并行运行4个线程 我的笔记本电脑是Core i3-2 cores=4个逻辑处理器,sumpallel没有执行并行作业,因为它按顺序创建并等待每个任务: int sum = Enumerable.Ra
我的笔记本电脑是Core i3-2 cores=4个逻辑处理器,
sumpallel
没有执行并行作业,因为它按顺序创建并等待每个任务:
int sum = Enumerable.Range(1, 1000_000_000)
.AsParallel()
.Select(i => i % 2 == 0 ? -i : i).Sum();
for(int i=1;i<5;i++){
//...
等待GetSum(intList、skip、take)
要使其并行,您必须启动所有五项任务,然后wait
所有任务都要完成wait Task.whalll(任务);
至于并行Linq比标准Linq慢,这是因为您的工作负载过于细粒度。因此,并行的开销抵消了并行执行的任何好处。换句话说,将项目分发到线程并收集结果比实际计算要多(
n%2
)。为了最大限度地利用并行性,您的工作负载必须很大。您可以查看一下Task.WhenAll()
谢谢,这解决了我的问题。现在,需要5秒钟才能完成100%的CPU利用率。@teenup请注意,该模式可能不是一种有效的数据分区方式,具体取决于您运行代码的平台。我认为.NET Core为此实现了特定的优化(显然很常见)场景,但.NET Framework未进行优化,从第一个开始,将沿着缓慢的路径逐个枚举列表中的元素。实际上,如果修改并行工作的线程数,我会得到不同的总和。我不知道为什么。我正在为此发布另一个问题。请看一看是否可以n、 这是:
int sum = Enumerable.Range(1, 1000_000_000)
.AsParallel()
.Select(i => i % 2 == 0 ? -i : i).Sum();
for(int i = 1; i < 5; i++) {
//...
await GetSum(intList, skip, take)