File.Copy vs. Manual FileStream.Write Para Copiar Arquivo

Meu problema é em relação ao desempenho de cópia de arquivos. Temos um sistema de gerenciamento de mídia que requer muitos arquivos em movimento no sistema de arquivos para diferentes locais, incluindo compartilhamentos do Windows na mesma rede, sites FTP, AmazonS3 etc. Quando estávamos todos em uma rede do Windows, podíamos usar System.IO.File.Copy (origem, destino) para copiar um arquivo. Como muitas vezes tudo o que temos é um fluxo de entrada (como um MemoryStream), tentamos abstrair a operação de cópia para obter um fluxo de entrada e um fluxo de saída, mas estamos vendo uma queda massiva de desempenho. Abaixo está um código para copiar um arquivo para usar como um ponto de discussão.

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();
        }
    }
}

Alguém sabe por que isso funciona muito mais lento do que o File.Copy? Existe algo que eu possa fazer para melhorar o desempenho? Será que vou ter que colocar uma lógica especial para ver se estou copiando de uma localização do Windows para outra - nesse caso, eu usaria apenas o File.Copy e, em outros casos, usaria os fluxos?

Por favor, deixe-me saber o que você pensa e se você precisa de informações adicionais. Eu tentei diferentes tamanhos de buffer e parece que um tamanho de buffer de 64k é ideal para nossos arquivos "pequenos" e 256k + é um tamanho de buffer melhor para nossos arquivos "grandes" - mas em qualquer caso ele é muito pior que File.Copy ( ). Desde já, obrigado!

questionAnswers(8)

yourAnswerToTheQuestion