Pergunta

Como é que se escolher o tamanho de um buffer (bytes I ler ou escrever para socket) para o máximo rendimento ao implementar um baixo nível HTTP e transferência FTP? Meu aplicativo deve transferir dados com HTTP ou FTP em conexões que variam de 130 Kbps a 3 Mbps (eu sei a velocidade esperada de antemão). Às vezes é uma transferência de um jeito, às vezes ele vai nos dois sentidos. Devo ficar com algum tamanho médio tampão ou I deve variar isso dependendo da velocidade de conexão?

Graças.

Foi útil?

Solução

Em primeiro lugar, obter algumas medidas.

Em seguida, depois de ter uma medição de desempenho confiável, fazer alterações para o tamanho do buffer e traçar um gráfico do tamanho do buffer de velocidade vs..

Uma vez que você sabe que as velocidades de conexão de antecedência, você deve ser capaz de obter algumas medições de velocidades reais com diferentes tamanhos de buffer real.

O sistema operacional, pilha de protocolos e rede é demasiado complexo para trabalhar fora uma resposta a partir de primeiros princípios. Você precisa medir antes de fazer qualquer coisa.

Outras dicas

Escolha um tamanho de buffer mais de 8 KB. 9000 é normalmente a MTU maior (unidade de transmissão máxima) tamanho usado até mesmo nas redes mais rápidas.

Quando você usa um buffer maior do que o MTU da conexão, o sistema operacional irá dividi-la no MTU tamanho peças conforme necessário, e, portanto, qualquer coisa que você usar sobre a MTU terá pouco efeito no desempenho da rede.

No entanto, usando um buffer grande provavelmente vai ter outro efeito sobre o desempenho, se você está transferindo arquivos, em seguida, usando grandes buffers pode aumentar o desempenho de leitura, melhorando assim a velocidade de sua aplicação.

Então, geralmente a escolha de um número redondo como 16KB é uma boa idéia. Definitivamente não ir sob 1500, pois isso pode negativamente o desempenho da rede efeito (fazendo com que o sistema operacional para, por vezes, enviar pequenos pacotes, que o desempenho diminuição na rede).

Você pode obter buffer de tamanho: httpSocket.getReceiveBufferSize (); Eu recomendo escrever este tampão de RAM no processo de leitura. Por exemplo: ByteArrayOutputStream memoryFile. e só depois de encher a gravação de buffer no disco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top