如果您所做的只是在系统中复制或移动文件,那么 TPL 提供的并行性对您没有多大帮助。例如,移动实际上不使用任何 CPU,它只是更改磁盘目录记录结构中的文件位置。
文件压缩是另一回事。在这里,您正在加载数据并使用 CPU 对其进行压缩,然后再将其保存到磁盘。您也许可以使用管道或并行循环以更有效的方式加载/压缩/保存数据。您可以让多个线程处理不同的文件,而不是让一个线程处理每个文件。
以下代码顺序压缩大量文件,然后并行压缩。我在 i7 920 和英特尔 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);
}
}
}
}
}
}
有关压缩代码,请参见如何:压缩文件