.NET并行编程:TPL之数据并行
&应用场景
1、文件批量上传
并行上传单个文件。也可以把一个文件拆成几段分开上传,加快上传速度。
2、数据分批计算
如几百万数据可以拆成许多无关联的部分,并行计算处理。最后聚合
3、数据推送
将数据拆解后,并行推送。
&任务并行库-数据并行
如果在一个循环内在每次迭代只执行少量工作或者它没有运行多次迭代,那么并行化的开销可能会导致代码运行的更慢。使用并行之前,应该对线程(锁,死锁,竞争条件)应该有基本的了解。
1、Parallel.For
/// <summary>
/// 正常循环
/// </summary>
public void FormalDirRun()
{
long totalSize = 0;
var dir = @"E:\LearnWall\orleans";//args[1];
String[] files = Directory.GetFiles(dir);
stopwatch.Restart();
for (var i = 0; i < files.Length; i++)
{
FileInfo fi = new FileInfo(files[i]);
long size = fi.Length;
Interlocked.Add(ref totalSize, size);
}
stopwatch.Stop();
Console.WriteLine($"FormalDirRun------{files.Length} files, {totalSize} bytes,time:{stopwatch.ElapsedMilliseconds},Dir:{dir}");
}
/// <summary>
/// 并行循环
/// </summary>
public void ParallelForDirRun()
{
long totalSize = 0;
var dir = @"E:\LearnWall\orleans";//args[1];
String[] files = Directory.GetFiles(dir);
stopwatch.Restart();
Parallel.For(0, files.Length,index =>
{
FileInfo fi = new FileInfo(files[index]);
long size = fi.Length;
Interlocked.Add(ref totalSize, size);
});
stopwatch.Stop();
Console.WriteLine($"ParallelForDirRun-{files.Length} files, {totalSize} bytes,time:{stopwatch.ElapsedMilliseconds},Dir:{dir}");
}
从下图对比接口可以看出当循环体内方法执行时间很短时,并行时间反而更长。这块会有更细致的补充。
2、Paralle.ForEach
为了并行速度的最大化,我们应该尽量减少在并行内对共享资源的访问,如Console.Write,文件日志等...但这里为了显示效果,就用了。