Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 为什么可以';我的并行任务代码不能达到100%的CPU利用率吗?_C#_Multithreading - Fatal编程技术网

C# 为什么可以';我的并行任务代码不能达到100%的CPU利用率吗?

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

手动并行任务代码=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.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)