我们平时大多数接触的循环是 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 运行效率高一点。
总结
并发计算:它是无序的,数据量大循环,效果高,因为它是并发。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107135.html