Está lendo um arquivo no UNIX mais rápido do que gravar um arquivo?

2

Desculpe pela simples simplicidade desta questão. Um gargalo de desempenho bastante obtuso se resumiu a essa consulta muito pequena. Eu fiz algumas análises empíricas e acho que posso estar sendo vitimado por estratégias de cache de disco. Fundamentalmente (se o cache de disco fosse desativado), a gravação de um arquivo seria tão rápida, mais lenta ou mais rápida do que a leitura de um arquivo? Eu diria que a resposta dependeria da fragmentação (e do tamanho do arquivo), mas a operação para gravar um arquivo teria que fazer uma pesquisa adicional de onde o próximo bloco livre é, em vez de apenas seguir o ponteiro para ele. Qualquer insight é apreciado.

    
por ojblass 22.08.2014 / 20:11

2 respostas

3

Depende. Não há uma resposta geral para essa questão.

Na ausência de cache, a gravação de um arquivo em disco é geralmente mais lenta do que a leitura. Isso tem pouco a ver com o sistema operacional e tudo a ver com o hardware: os discos rígidos e a mídia de estado sólido são lidos mais rapidamente do que escrevem. Um fator secundário está relacionado à estrutura do sistema de arquivos: a leitura só precisa percorrer a árvore de diretórios e a lista de bloqueios até os dados, depois ler os dados, enquanto a escrita precisa executar o mesmo percurso, gravar os dados e atualizar alguns metadados. / p>

Quando o cache entra em jogo, as coisas mudam. A leitura de dados que estão no cache é muito rápida, mas a leitura de dados que não estão no cache tem que ir e buscá-los no disco. Os sistemas operacionais podem tentar antecipar leituras, mas isso só funciona em casos muito específicos (principalmente leituras sequenciais de um arquivo). A escrita, por outro lado, pode ser quase instantânea, desde que a quantidade de dados não seja muito grande, pois os dados são gravados apenas em um buffer de memória. O buffer tem que ser gravado no disco eventualmente, mas até lá seu aplicativo já foi movido para fazer mais coisas.

    
por 23.08.2014 / 01:04
1

Escrever deve ser mais rápido.

A lista de bloqueio livre é mantida na memória, portanto, encontrar o próximo bloco livre será muito rápido. A menos que você esteja escrevendo em modo síncrono, quando você tentar escrever algo, ele simplesmente copiará os dados em um buffer de kernel e enfileirará a gravação; não precisa esperar que a E / S seja concluída.

Por outro lado, uma leitura precisa aguardar a conclusão da E / S, já que o chamador não pode fazer nada até que os dados cheguem.

    
por 22.08.2014 / 21:33