File.Copy vs. Manual FileStream.Write per copiare file

Il mio problema riguarda le prestazioni di copia dei file. Abbiamo un sistema di gestione dei media che richiede molti file in movimento sul file system in diverse posizioni, comprese le condivisioni Windows sulla stessa rete, siti FTP, AmazonS3, ecc. Quando eravamo tutti su una rete Windows, potevamo farcela usando System.IO.File.Copy (origine, destinazione) per copiare un file. Dal momento che molte volte abbiamo un input Stream (come un MemoryStream), abbiamo provato ad astrarre l’operazione Copy per prendere un input Stream e un stream di output, ma stiamo assistendo a una massiccia diminuzione delle prestazioni. Di seguito è riportato un codice per copiare un file da utilizzare come punto di discussione.

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

Qualcuno sa perché questo si comporta molto più lentamente di File.Copy? C’è qualcosa che posso fare per migliorare le prestazioni? Devo solo inserire una logica speciale per vedere se sto copiando da una posizione Windows a un’altra – nel qual caso userò semplicemente File.Copy e negli altri casi userò i flussi?

Per favore fatemi sapere cosa ne pensate e se avete bisogno di ulteriori informazioni. Ho provato diverse dimensioni del buffer e sembra che una dimensione del buffer di 64k sia ottimale per i nostri file “piccoli” e 256k + è una dimensione del buffer migliore per i nostri file “grandi” – ma in entrambi i casi ha prestazioni molto peggiori di File.Copy ( ). Grazie in anticipo!