我的问题是关于文件复制性能。我们有一个媒体管理系统,需要将文件系统上的大量移动文件移动到不同的位置,包括同一网络上的Windows共享,FTP站点,AmazonS3等等。当我们都在一个Windows网络中时,我们可以放弃使用System.IO.File.Copy(源,目标)复制文件。由于很多时候我们只有一个输入流(就像一个MemoryStream),我们尝试抽象复制操作来获取输入流和输出流,但是我们看到性能大幅下降。以下是一些用于复制文件以用作讨论点的代码。File.Copy与手动FileStream.Write复制文件
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慢得多?有什么我可以做的改善表现?我只需要添加特殊的逻辑来查看是否从一个窗口位置复制到另一个窗口位置 - 在这种情况下,我只是使用File.Copy,而在其他情况下,我将使用这些流?
请让我知道您的想法以及您是否需要其他信息。我尝试了不同的缓冲区大小,似乎64k缓冲区大小对于我们的“小”文件是最佳的,256k +对于我们的“大”文件来说是更好的缓冲区大小 - 但是在任何情况下,它的性能都比File.Copy )。提前致谢!
这可能与本机互操作有关。我怀疑File.Copy()和流IO操作是建立在Windows API之上的,并且在一个循环中重复调用流读/写比一个本地拷贝文件调用File.Copy()更加昂贵,会做出。 – 2009-08-07 20:50:13
@Steve:你是对的,看到我的回应。 – 2009-08-07 21:26:18