Dar*_*der 4 .net c# io parallel-processing parallel-extensions
我有一个具有大量IO操作的应用程序,例如文件复制,压缩和移动文件系统周围的文件,复制到备份服务器.
我将此程序构建为单线程.它运行2分钟.
我使用Parallel扩展并使用Task构建了该程序的另一个版本,它几乎在2分钟内运行.
换句话说,由于IO很大,我没有看到使用Parallels带来的性能提升.
如果我将应用程序部署到刀片服务器,我会得到相同的结果吗?
刀片服务器是否比我的工作站更快/更多地处理IO?
将Parallels与IO绑定应用程序一起使用没有任何好处吗?
如果您所做的只是在系统中复制或移动文件,那么TPL提供的并行性对您没有多大帮助.例如,移动实际上不使用任何CPU,它只是更改磁盘目录记录结构中的文件位置.
文件压缩是一个不同的故事.在这里,您要加载数据并使用CPU进行压缩,然后再将其保存到磁盘.您可以使用管道或并行循环以更有效的方式加载/压缩/保存数据.而不是让一个线程工作压缩每个文件,你可以有多个线程处理不同的文件.
以下代码按顺序压缩文件加载,然后并行压缩.我在i7 920和intel X25 SSD上得到以下时间,压缩329张JPG图像,总计800Mb的数据.
顺序:39901ms
平行:12404ms
class Program
{
static void Main(string[] args)
{
string[] paths = Directory.GetFiles(@"C:\temp", "*.jpg");
DirectoryInfo di = new DirectoryInfo(@"C:\temp");
Stopwatch sw = new Stopwatch();
sw.Start();
foreach (FileInfo fi in di.GetFiles("*.jpg"))
{
Compress(fi);
}
sw.Stop();
Console.WriteLine("Sequential: " + sw.ElapsedMilliseconds);
Console.WriteLine("Delete the results files and then rerun...");
Console.ReadKey();
sw.Reset();
sw.Start();
Parallel.ForEach(di.GetFiles("*.jpg"), (fi) => { Compress(fi); });
sw.Stop();
Console.WriteLine("Parallel: " + sw.ElapsedMilliseconds);
Console.ReadKey();
}
public static void Compress(FileInfo fi)
{
using (FileStream inFile = fi.OpenRead())
{
if ((File.GetAttributes(fi.FullName)
& FileAttributes.Hidden)
!= FileAttributes.Hidden & fi.Extension != ".gz")
{
using (FileStream outFile =
File.Create(fi.FullName + ".gz"))
{
using (GZipStream Compress =
new GZipStream(outFile,
CompressionMode.Compress))
{
inFile.CopyTo(Compress);
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有关压缩代码,请参见如何:压缩文件
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |