Calculando a velocidade de conexão / download

Eu tenho um programa cliente e servidor (ambos em Obj-C) e estou transferindo arquivos entre dois dispositivos usando os programas.

A transferência está funcionando bem, mas gostaria de mostrar ao usuário qual taxa de transferência eles estão obtendo.

Então, eu sei o tamanho total do arquivo e quanto do arquivo foi transferido, existe uma maneira de descobrir a taxa de transferência a partir dessas informações, e se não, quais informações eu preciso para calcular a taxa de transferência?

obrigado

Assim que você iniciar o download, capture a hora atual do sistema e armazene-a como a “hora de início”. Então, tudo o que você precisa fazer para calcular a velocidade de transferência em qualquer ponto durante a transferência é olhar novamente para a hora do sistema e usá-la como a “hora atual” para calcular o tempo total gasto até agora:

transfer_speed = bytes_transferred / ( current_time - start_time) 

Você provavelmente quer usar a precisão de segundo ou milissegundos com os tempos e, é claro, pode multiplicar o resultado por 8 se quiser bits / segundo.

Como você está usando o Cocoa, você pode usar a class NSDate para obter os timestamps. Por exemplo, use o seguinte ao iniciar a transferência:

 NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 

Em seguida, verifique periodicamente a taxa de transferência usando:

 double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start); 

A maneira ingênua é bytes_downloaded / (now - start_time) , mas isso se torna impreciso se a velocidade da conexão flutuar descontroladamente, ou se o usuário iniciar outro download (talvez em outro aplicativo) na metade do download. Ambos podem acontecer se o usuário executar um torrent em segundo plano.

Uma maneira melhor (embora mais difícil de implementar) é manter uma série de amostras periódicas e apresentar a média.

Comece com uma matriz contendo 0. A matriz é de amostras e cada amostra é o número de bytes baixados desde a amostra anterior. Então inicie o download.

A cada meio segundo (você pode tentar intervalos diferentes), meça quantos bytes você baixou e, em seguida, subtraia o total anterior desse novo total. Adicione a diferença como o novo último elemento na matriz. Se isso aumentar a matriz além de um determinado tamanho, retire o primeiro elemento (amostra mais antiga). Em seguida, apresente a média de todas as amostras.

Você deve ficar entre 2 a 5 segundos de amostras, e o intervalo deve estar entre 0,5 e 1 segundo (é uma troca entre moeda e desempenho).

Você também pode querer remover o primeiro elemento da matriz depois de recuperá-lo se for zero. Isso torna sua reportagem inicial mais precisa e ajuda você a se recuperar mais rapidamente das barracas, já que você não está incluindo zeros antigos na média.

Você precisa saber

  1. Bytes enviados desde o início (para calcular a taxa média de transferência)

  2. Bytes enviados desde o último segundo (para calcular a velocidade de transferência atual).

    Isso pode ser feito facilmente se você souber os bytes enviados desde o início. (Novos bytes enviados desde o início – Bytes enviados desde o início há 1 segundo)

  3. Tamanho total do arquivo (para calcular a porcentagem de progresso).

    (Bytes transferidos / Número total de bytes)

Acompanhe o tempo que a transferência está levando. A taxa de transferência é simplesmente bytes transferidos / segundos transcorridos, em outras palavras, bytes por segundo. Você não precisa do tamanho total para isso. (Você também pode mostrar% concluída, que é bytes transferidos / total de bytes * 100)