首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个并行代码比它类似的非并行版本慢呢?

为什么这个并行代码比它类似的非并行版本慢呢?
EN

Stack Overflow用户
提问于 2016-01-09 06:24:19
回答 2查看 392关注 0票数 1

我有以下代码(从LINQPad复制到这里)。显然,我似乎不明白TPL是如何工作的,或者代码是垃圾,为什么并行版本比它的非并行版本运行慢呢?

代码语言:javascript
复制
for (int i = 0; i < 100; i++)
{
    ParallelOptions ops = new ParallelOptions();
    ops.MaxDegreeOfParallelism = Environment.ProcessorCount;

    var watch = Stopwatch.StartNew();
    Parallel.ForEach<int>(Enumerable.Range(1, 10000000), ops, x => { int y = x + 1; });
    watch.Stop();
    Console.WriteLine("Parallel: {0}", watch.Elapsed.TotalSeconds);

    watch = Stopwatch.StartNew();
    foreach (var x in Enumerable.Range(1, 10000000))
    {
        int y = x + 1;
    }
    watch.Stop();
    Console.WriteLine("Non-parallel: {0}\n", watch.Elapsed.TotalSeconds);
}

前10项结果:

平行: 0.1991644非平行: 0.0466178

平行: 0.1723428非平行: 0.0447134

平行: 0.1141791非平行: 0.0444557

平行: 0.1758878非平行: 0.0444636

平行: 0.1687637非平行: 0.0444338

平行: 0.1677679非平行: 0.0445771

平行: 0.1191462非平行: 0.0446116

平行: 0.1702483非平行: 0.0454863

平行: 0.1143605非平行: 0.0451731

平行: 0.2155218非平行: 0.0450392

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-09 06:46:21

好吧,你能得到的最好的答案是运行一个分析器工具,并测量你的代码发生了什么。但我的猜测是,您的并行代码速度较慢,因为您的代码非常简单,启动线程并在它们之间切换会增加成本,因此计算速度方面的任何优势都可以忽略不计。

但是,尝试进行一些实质性的计算,最终您将拥有并行执行的优势。你的代码太简单了。现代CPU不能以这种方式加载。

票数 3
EN

Stack Overflow用户

发布于 2016-01-09 07:06:56

因为我不能将它添加为注释,所以我将添加另一个答案来发布修改后的代码。@ixSci在他的回答中说的似乎是正确的。我在并行代码体中执行了一个很小的操作,执行速度非常快,但是速度慢是因为在线程之间切换上下文花费了大量时间?当我将代码改为休眠一段时间而不是将int值增加1时,并行代码大约为4(否)。)比非并行版本快一倍。

代码语言:javascript
复制
for (int i = 0; i < 100; i++)
{
    ParallelOptions ops = new ParallelOptions();
    ops.MaxDegreeOfParallelism = Environment.ProcessorCount;

    var partitioner = Partitioner.Create<int>(Enumerable.Range(1, 5000));

    var watch = Stopwatch.StartNew();
    Parallel.ForEach<int>(partitioner, ops, x => { Thread.Sleep(1); });
    watch.Stop();
    Console.WriteLine("Parallel: {0}", watch.Elapsed.TotalSeconds);

    watch = Stopwatch.StartNew();
    foreach (var x in Enumerable.Range(1, 5000))
    {
        Thread.Sleep(1);
    }
    watch.Stop();
    Console.WriteLine("Non-parallel: {0}\n", watch.Elapsed.TotalSeconds);
}

前10项结果:

平行: 1.2887589非平行: 5.0020569

平行: 1.277047非平行: 5.0011116

平行: 1.2790631非平行: 5.0001498

平行: 1.2770644非平行: 5.0052016

平行: 1.2770013非平行: 5.0021479

平行: 1.2770031非平行: 5.0001927

平行: 1.2799937非平行: 5.0062141

平行: 1.2819909非平行: 5.0171945

平行: 1.2780496非平行: 5.0071667

平行: 1.2821714非平行: 5.0082108

平行: 1.2777875非平行: 5.0152099

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34690429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档