雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

Parallel.For和普通For的区别

2024-10-17 25

Parallel类是.NET 4中新增的抽象线程类。Parallel.For()方法类似于C#的for循环语句,也是多次执行一个任务。但是使用Parallel.For()方法,可以并行运行。

对于Parallel.For、Parallel.Foreach的使用应该要特别小心,它们的优势是处理列表很长,且对列表内的元素进行很复杂的业务逻辑,且不会使用共享资源,只针对自身的业务逻辑处理,方才能提升效率。

如果逻辑过于简单的话,创建线程的花费将大于业务执行的花费,此时不建议使用Parallel。

Parallel.For和Parallel.ForEach都会在执行完所有循环后再执行后面的代码。

下面给出了一个例子,用来体现Parallel.For和普通For的区别:

static void Main(string[] args)
        {
            Console.WriteLine("Parallel.For");
            T1();
            Console.WriteLine("普通For");
            T2();
            Console.ReadLine();
        }

        static void T1() {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            Parallel.For(0, 50, i =>
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                using (WebClient wc = new WebClient())
                {
                    var aa = wc.DownloadString("http://www.leavescn.com/Articles/Content/"; + i + "?rnd=" + Guid.NewGuid());
                    sw.Stop();
                    Console.Write(string.Format("[{0}-耗时{1}]", i, sw.ElapsedMilliseconds));
                }
            });
            stopwatch.Stop();
            Console.WriteLine("\nEnd-执行时间:" + stopwatch.ElapsedMilliseconds);
            
        }
        static void T2()
        {
            
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for(int i=0;i<50; i++) {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                using (WebClient wc = new WebClient())
                {
                    var aa = wc.DownloadString("http://www.leavescn.com/Articles/Content/"; + i + "?rnd=" + Guid.NewGuid());
                    sw.Stop();
                    Console.Write(string.Format("[{0}-耗时{1}]", i, sw.ElapsedMilliseconds));
                }
            };
            stopwatch.Stop();
            Console.WriteLine("\nEnd-执行时间:" + stopwatch.ElapsedMilliseconds);
        }

执行结果如下:

可以看到,Parallel.For和普通For都是在执行完循环体内的代码再执行后面的代码。

在执行50次下载任务时,使用Parallel.For的话,执行时间少了1s。

更新于:26天前
赞一波!

文章评论

评论问答