Supondo que exista um pouco de código que leia arquivos para vários consumidores e os arquivos sejam de qualquer tamanho arbitrário: em que tamanho se torna mais eficiente ler o arquivo de forma assíncrona? Ou, em outras palavras, quão pequeno deve ser um arquivo para que seja mais rápido apenas para lê-lo de forma síncrona?
Percebi (e talvez esteja incorreto) que, ao ler arquivos muito pequenos, leva mais tempo para lê-los de forma assíncrona do que síncrona (em particular com o .NET). Suponho que isso esteja relacionado ao tempo de configuração de coisas como portas de conclusão de E / S, threads etc.
Existe alguma regra de ouro para ajudar aqui? Ou é dependente do sistema e do ambiente?
efficiency
async
io
blesh
fonte
fonte
Respostas:
Infelizmente, a resposta é "depende". Seria fácil para você escrever um pequeno programa para determinar empiricamente os tempos das leituras assíncrona e sincronizada.
Vai depender de muitos fatores. Eles são armazenados em discos giratórios, SSD ou em uma unidade de rede? Que tipo de CPU você está usando? Quantos soquetes / núcleos? Você está executando em uma VM ou bare metal? Você está executando um sistema operacional antigo ou moderno?
fonte
O Async tem 3 vantagens principais:
Acredito que a principal vantagem da leitura assíncrona é quando você trabalha com muitos arquivos ou precisa de muita energia da CPU.
fonte
blocked waiting for I/O
(0% CPU) paracontinue normal processing
(> 0% CPU).Depende
Uma coisa a ter em mente é o preço da troca de contexto entre os processos. O Node.JS foi projetado da maneira que é porque supõe que fazer uma alternância de contexto é muito caro e você terá muitos processos aguardando no IE, o que atrapalha o computador.
Por outro lado, Erlang faz com que um contexto de processo mude muito barato, para que tudo possa ser síncrono e o tempo de execução de Erlang possa acompanhar tudo.
Portanto, os fatores a serem considerados:
E tenho certeza de que estou deixando de fora uma meia dúzia de fatores
fonte
Não sei se há um "ponto" específico, mas faz mais sentido quando você tem muitos threads trabalhando, pois permite sobrepor sua E / S a outro trabalho. Se você tiver threads sobressalentes ociosos, a leitura assíncrona não dará nenhuma vantagem. Somente quando você tem filas de trabalho sendo preenchidas e seu encadeamento pode ser útil para realizar outro trabalho, em vez de esperar pela E / S, o acesso assíncrono aos arquivos oferece alguma vantagem.
fonte
Acho que o problema aqui não é tanto a velocidade de leitura, mas a latência.
Se você estiver lendo de uma unidade de rede ou de uma unidade de disco rígido mecânica lenta com longas filas, o desempenho será prejudicial para a leitura. E se o seu aplicativo também estiver fazendo a leitura no encadeamento da GUI, nesse caso, é um aplicativo muito ruim, será péssimo para o usuário.
fonte