【发布时间】:2010-11-17 19:53:13
【问题描述】:
我的问题在于文件复制性能。我们有一个媒体管理系统,需要将文件系统上的大量文件移动到不同的位置,包括同一网络上的 Windows 共享、FTP 站点、AmazonS3 等。当我们都在一个 Windows 网络上时,我们可以使用System.IO.File.Copy(source, destination) 复制文件。由于很多时候我们只有一个输入流(如 MemoryStream),我们尝试抽象复制操作以获取输入流和输出流,但我们看到性能大幅下降。下面是一些用于复制文件以用作讨论点的代码。
public void Copy(System.IO.Stream inStream, string outputFilePath)
{
int bufferSize = 1024 * 64;
using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
{
int bytesRead = -1;
byte[] bytes = new byte[bufferSize];
while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
{
fileStream.Write(bytes, 0, bytesRead);
fileStream.Flush();
}
}
}
有谁知道为什么它的执行速度比 File.Copy 慢得多?我能做些什么来提高性能吗?我是否只需要输入特殊的逻辑来查看我是否要从一个 Windows 位置复制到另一个位置 - 在这种情况下我将只使用 File.Copy 而在其他情况下我将使用流?
请让我知道您的想法以及您是否需要更多信息。我尝试了不同的缓冲区大小,似乎 64k 缓冲区大小对于我们的“小”文件来说是最佳的,而 256k+ 是我们的“大”文件更好的缓冲区大小——但无论哪种情况,它的性能都比 File.Copy( )。提前致谢!
【问题讨论】:
-
这可能与本机互操作有关。我怀疑 File.Copy() 和流 IO 操作是建立在 Windows API 之上的,并且在循环中重复调用流读/写比调用 File.Copy() 的一个本机复制文件成本更高会做的。
-
@Steve:你是对的,看看我的回复。
标签: c# windows performance