首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C#中的并行循环比简单的循环花费更多的时间?

为什么C#中的并行循环比简单的循环花费更多的时间?
EN

Stack Overflow用户
提问于 2014-07-04 02:55:22
回答 2查看 1.4K关注 0票数 0

我在c#中有一个计算流体力学(计算流体力学),它需要花费太多的时间来计算结果。为了改进我的代码,我开始学习TPL并使用并行代码。对于顺序不重要的循环,我可以使用TPL,对于有顺序的循环,PLINQ是唯一的方法。我说的对吗?

作为第一步,我将循环改为Parallel.For,有趣的是发现运行时增加了!

我的代码示例:

代码语言:javascript
复制
for (int i = 0; i < nx; i++)
{
    for (int j = 0; j < ny; j++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity

        }
     }
 }

具有并行任务:

代码语言:javascript
复制
Parallel.for (0,nx, i =>
{
    for (int j = 0; j < ny; j++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity
        }
    }
});

,我如何加快我的代码?,我的每个输出需要10分钟,这是非常长的时间,我至少有5000个输出。

EN

回答 2

Stack Overflow用户

发布于 2014-07-04 02:57:56

对于小循环,管理线程的开销可能会影响整个执行时间。如果每次迭代执行时间较长,您可能会看到不同的结果。

票数 3
EN

Stack Overflow用户

发布于 2014-07-04 04:08:14

在大型数据集(例如,至少50万个单元)上,您可能会遇到缓存失效的问题,因为您对内存的迭代效率很低。

如果将其更改为TPL(无论是否使用TPL),您可能会看到性能的提高(请注意我是如何将迭代从i,j切换到j,i的):

代码语言:javascript
复制
for (int j = 0; j < ny; j++)
{
    for (int i = 0; i < nx; i++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity

        }
     }
 }

请参见这里的解释:Why does the order of the loops affect performance when iterating over a 2D array?

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

https://stackoverflow.com/questions/24566053

复制
相关文章

相似问题

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