首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parallel.For与

Parallel.For与
EN

Stack Overflow用户
提问于 2013-05-31 20:08:34
回答 2查看 3.4K关注 0票数 4

我有一个Parallel.For和一个常规的for循环执行一些简单的运算,只是为了对Parallel.For进行基准测试

我的结论是,在我的i5笔记本处理器上,常规的for速度更快。

这是我的代码

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int Iterations = int.MaxValue / 1000;
            DateTime StartTime = DateTime.MinValue;
            DateTime EndTime = DateTime.MinValue;

            StartTime = DateTime.Now;
            Parallel.For(0, Iterations, i =>
            {
                OperationDoWork(i);
            });
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            for (int i = 0; i < Iterations; i++)
            {
                OperationDoWork(i);
            }
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            Parallel.For(0, Iterations, i =>
            {
                OperationDoWork(i);
            });
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            for (int i = 0; i < Iterations; i++)
            {
                OperationDoWork(i);
            }
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());
        }

        private static void OperationDoWork(int i)
        {
            int a = 0;
            a += i;
            i = a;
            a *= 2;
            a = a * a;
            a = i;
        }
    }
}

这是我的结果。在重复的时候不会有太大的变化:

代码语言:javascript
复制
00:00:03.9062234
00:00:01.7971028
00:00:03.2231844
00:00:01.7781017

那么为什么要使用Parallel.For呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-31 20:14:59

当人们第一次深入研究多线程时,最常见的错误之一就是相信多线程是一个Free Lunch

事实上,将您的操作拆分成多个较小的操作,然后这些操作可以并行运行,这将需要一些额外的时间。如果同步不好,您的任务很可能会花费更多的时间,等待其他任务释放它们的锁。

因此,当每个任务只做很少的工作时,并行化就不值得花时间/麻烦,OperationDoWork就是这种情况。

编辑:

请考虑尝试以下操作:

代码语言:javascript
复制
    private static void OperationDoWork(int i)
    {
        double a = 101.1D * i;
        for (int k = 0; k < 100; k++)
            a = Math.Pow(a, a);
    }

根据我的基准测试,在我的Core2Duo处理器上,for平均为5.7秒,而Parallel.For为3.05秒(加速== ~1.87)。

在我的四核i7上,使用for的平均时间为5.1秒,使用Parallel.For的平均时间为1.38秒(加速== ~3.7)。

修改后的代码可以很好地扩展到可用的物理核心数量。Q.E.D.

票数 7
EN

Stack Overflow用户

发布于 2013-05-31 20:15:23

并行处理有组织开销。考虑一下有100个任务和10个人来做这些任务。让10个人为你工作并不容易,除了实际完成100项任务外,还需要组织谁来做耗时的事情。

因此,如果你想并行做一些事情,确保它是如此多的工作,组织并行的工作量与实际工作量相比是非常小的,所以这样做是有意义的。

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

https://stackoverflow.com/questions/16856923

复制
相关文章

相似问题

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