Grande pergunta.
E / S sem buffer é uma cópia de arquivo simples de um local de origem para um local de destino. A E / S armazenada em buffer aumenta a cópia simples para otimizar as futuras leituras (e grava) no mesmo arquivo copiando o arquivo para o cache do sistema de arquivos , que é uma região da memória virtual. E / s com buffer incorrer em uma penalidade de desempenho na primeira vez que o arquivo é acessado porque ele tem que copiar o arquivo na memória; no entanto, como o acesso à memória é mais rápido que o acesso ao disco, o acesso subsequente ao arquivo deve ser mais rápido. O sistema operacional cuida da sincronização de gravações de arquivos de volta ao disco e as leituras podem ser obtidas diretamente da memória.
A nota de uso menciona arquivos grandes em relação à E / S armazenada em buffer porque:
- O custo inicial é caro. A penalidade de desempenho com E / S armazenada em buffer é substancialmente pior para arquivos grandes.
- Você recebe pouco retorno. Blocos de arquivos grandes tendem a permanecer no cache por muito tempo, a menos que você tenha uma tonelada de memória em relação ao tamanho do arquivo.
- Pode não evitar E / S de disco. As leituras e gravação de blocos de dados de arquivos grandes aumentam a probabilidade de exigir E / S de disco.
- Provavelmente você não precisa fazer buffer de qualquer maneira. Arquivos grandes tendem a ser acessados com menos frequência na prática do que arquivos menores.
Portanto, há uma compensação, mas o que é apropriado para você depende do seu caso específico. Se você estiver compactando um monte de arquivos e transmitindo o zip para um destino de backup, sem buffer será o caminho a ser seguido. Copiando um monte de arquivos que acabaram de ser alterados? Buffered deve ser mais rápido.
Por fim, observe que o tamanho do arquivo não é o único fator a decidir entre buffered e unbuffered. Como acontece com qualquer cache, o cache do sistema de arquivos é mais rápido, mas menor que a origem por trás dele. Isso requer uma estratégia de substituição de cache que determina quando despejar itens para abrir espaço para novos itens. Ele perde seu benefício quando itens acessados com frequência são despejados. Por exemplo, se você estiver sincronizando diretórios pessoais do usuário intraday para um local separado (ou seja, enquanto os usuários estiverem usando ativamente os arquivos), a E / S armazenada em buffer se beneficiaria de arquivos já residentes no cache, mas poderá poluir temporariamente o cache com arquivos obsoletos ; por outro lado, sem buffer dispensaria qualquer benefício dos arquivos já armazenados em cache. Nenhum vencedor claro nesse caso.
Nota: isso também se aplica a xcopy /J
Consulte Pergunte ao Blog da equipe de desempenho da Microsoft para mais.