Eu tenho um código de teste que gera uma lista de 5000 pequenos blocos de dados (tamanho mínimo: 351 bytes, tamanho máximo: 386 bytes, tamanho médio: 385 bytes) e os grava como arquivos separados em um diretório - média tempo de gravação é de cerca de 5 ms por arquivo
Se eu usar o mesmo código exato, em vez de escrever os 5000 blocos diferentes, repito os mesmos dados várias vezes (por exemplo, escrevendo 500 vezes o primeiro bloco 10), o tempo médio de gravação vai para menos de 2 ms por arquivo - como se de alguma forma o sistema de arquivos fosse capaz de otimizar as gravações porque os dados são os mesmos.
Alguém tem uma explicação para esse comportamento?
Teste em um processador Surface Pro 4-i5 com 8 GB de RAM, gravando na unidade de estado sólido integrada. O sistema operacional é o Windows 10.
Código de teste:
const int count = 5_000;
// Generate a list of count small byte arrays: min. size: 351, max size: 386, average size: 385
var bytes = SerializeObjects( count );
// Write them all to disk as individual files
var watch = Stopwatch.StartNew();
for ( var i = 0; i < count; i++ )
{
File.WriteAllBytes(
Path.Combine( _directory, Guid.NewGuid() + ".xml" ),
bytes[ i ]
);
}
watch.Stop();
// Timed at: around 5ms per file
Console.WriteLine( "Wrote {0:n0} files in {1:n0} ms ({2:n3} ms per file)", count, watch.ElapsedMilliseconds, (double)watch.ElapsedMilliseconds / count );
modificando a chamada WriteAllBytes()
para escrever bytes[ i % 10 ]
(repetindo assim os 10 primeiros valores repetidas vezes) o tempo por arquivo desce para menos de 2 mseg
Atualizar
Não é dedup:
PS > Get-DedupProperties C
Get-DedupProperties : Deduplication feature is not available