C#并行计算语法教程与性能对比案例

本文介绍了C#中TaskParallelLibrary(TPL)的使用,包括Parallel.For和Parallel.ForEach方法,以及并发计算的优势。在大数据量运算时,TPL能显著提高性能,但在小数据量下可能并无优势。此外,还发现foreach相比于for在运行效率上有轻微优势。
摘要由CSDN通过智能技术生成

我们平时大多数接触的循环是 for,foreach,它们语法简单,易上手。

今天与大家分享 并行计算

在Net Framework4 引入了新的Task Parallel Library(任务并行库,TPL),它支持数据并行、任务并行和流水线。让开发人员应付不同的并行场合。

-数据并行:有大量数据需要处理,并且必须对每一份数据执行同样的操作。比如通过256bit的密钥对100个Unicode字符串进行AES算法加密。

-任务并行:通过任务并发运行不同的操作。例如生成文件散列码,加密字符串,创建缩略图。

  • 流水线:这是任务并行和数据并行的结合体。

TPL引入了System.Threading.Tasks ,主类是Task,这个类表示一个异步的并发的操作,然而我们不一定要使用Task类的实例,可以使用Parallel静态类。它提供了Parallel.Invoke, Parallel.For Parallel.Forecah 三个方法。

语法教程
1、Paraller.For
总共有11个重载方法

在这里插入图片描述
大概意思:
fromInclusive–开始
toExclusive–结束
Action–方法

            Console.WriteLine("--------Parallel.For语法--------");
            Parallel.For(1, 11, x =>
             {
                 Console.WriteLine(x);
             });
            Console.ReadKey();

在这里插入图片描述
运行是无序的

2、Parallel.ForEach
总共有19个重载方法
随便讲解一个方法:
public static ParallelLoopResult ForEach(IEnumerable source, Action body);
IEnumerable–枚举,数组
Action–方法

            Console.WriteLine("--------Parallel.ForEach语法--------");
            var Numbers = Enumerable.Range(1, 10);
            Parallel.ForEach(Numbers, x =>
            {
                Console.WriteLine(x);
            });

在这里插入图片描述
3、Parallel.Invoke
只有1个重载
public static void Invoke(params Action[] actions);
Action[]–数组类的多个方法

            Parallel.Invoke(
                () => Console.WriteLine("Hello!"),
                () => Console.WriteLine("How are you"),
                () => Console.WriteLine("1234567890"),
                () =>Console.WriteLine("123456")
                );

在这里插入图片描述

性能对比篇

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 并行计算
{
    class Program
    {
        static void Main(string[] args)
        {
            Demo1();
            Demo2();
            Demo3();
            Demo4();
            Console.ReadKey();
        }
        //数组
        static int[] Data(int num)
        {
            int[] dt = new int[num];
            for (int i = 0; i < num; i++)
            {
                dt[i] = i;
            }
            return dt;
        }
        //模拟数据量大运算
        static bool SleepOrNot = false;

        static void Demo1()
        {
            int[] data = Data(10);
            DateTime dt1 = DateTime.Now;
            for (int i = 0; i < data.Length; i++)
            {
                if (SleepOrNot)
                {
                    Thread.Sleep(500);
                }
            }
            DateTime dt2 = DateTime.Now;
            Console.WriteLine("普通循环For运行时长:{0}毫秒。", (dt2 - dt1).TotalMilliseconds);
        }

        static void Demo2()
        {
            int[] data = Data(10);
            DateTime dt1 = DateTime.Now;
            foreach (var item in data)
            {
                if (SleepOrNot)
                {
                    Thread.Sleep(500);
                }
            }
          
            DateTime dt2 = DateTime.Now;
            Console.WriteLine("普通循环Foreach运行时长:{0}毫秒。", (dt2 - dt1).TotalMilliseconds);
        }

        static void Demo3()
        {
            int[] data = Data(10);
            DateTime dt1 = DateTime.Now;
            Parallel.For(0, data.Length, (i) =>
            {
                if (SleepOrNot)
                {
                    Thread.Sleep(500);
                }
            });
            DateTime dt2 = DateTime.Now;
            Console.WriteLine("并发循环For运行时长:{0}毫秒。", (dt2 - dt1).TotalMilliseconds);
        }

        static void Demo4()
        {
            int[] data = Data(10);
            DateTime dt1 = DateTime.Now;
            Parallel.ForEach(data, (i) => {
                if (SleepOrNot)
                {
                    Thread.Sleep(500);
                }
            });
            DateTime dt2 = DateTime.Now;
            Console.WriteLine("并发循环Foreach运行时长:{0}毫秒。", (dt2 - dt1).TotalMilliseconds);
        }
    }
}

SleepOrNot = true数量量大运算,并行有优势
在这里插入图片描述
SleepOrNot = false数量量小运算,并行无优势
在这里插入图片描述
另外发现一条规律:foreach 比 for 运行效率高一点。

总结
并发计算:它是无序的,数据量大循环,效果高,因为它是并发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值