[RESOLVIDO]Calculo de velocidade

6 respostas
fabriciov

Gostaria de saber como posso calcular a velocidade de transferência de bytes de um stream

private void startOutputStream(OutputStream out, FileInputStream fis) throws IOException
    {
        byte[] buffer = new byte[64 * 1024];
        int bytesRead = 0;

        while ((bytesRead = fis.read(buffer)) != -1) {
            if (bytesRead > 0) {
                out.write(buffer, 0, bytesRead);
             
                if (!mIsSending) {
                    mIsSending = true;
                    mCallback.onFileSending(mFilePath.getAbsolutePath());
                }
            }
        }
    }

6 Respostas

vtr002

A velocidade(fluxo de transição de informações) é medida pela quantidade de informações dividida pelo tempo.

Você já tem a quantidade de informações o tempo é mais fácil ainda:

long tempoInicial = new java.util.Date().getTime();
//Ações que deseja realizar
long tempoExecucao = (new java.util.Date().getTime() - tempoInicial)/1000; //te devolverá o tempo em segundos
double velocidade = variavelQtdeBytes/tempoExecucao;
fabriciov

Para ser mais exato, minha duvida é como tiro a quantidade de bytes transmitidos.

O byteRead da um número de 50-300 e o buffer da 641024 ou 2(641024) a cada interação do loop
estou transmitindo arquivos de 2000kb.

O número de bytes transmitidos tiro do buffer ou algum calculo entre o byteRead e o buffer ?

vtr002

Do jeito que está sua função você só conseguirá pegar qual foi a velocidade total do processo se a circular;
Mas se você quiser fazer em cima dos ByteRead, voCe consegue ter um valor mais dinamico

ViniGodoy

Você tem que somar os bytesRead num acumulador. Os bytesRead eram quantos bytes estavam disponíveis no socket naquele momento.

O calculo que o colega passou é a velocidade média. Você está interessado na velocidade instantânea. Isso é um pouco mais difícil de calcular.

Eu criaria uma pequena lista, com os dados transmitidos de segundo em segundo nos últimos 5 segundos. E faria o total só desses últimos 5 segundos. Assim, você consegue perceber melhor a taxa de transmissão naquele momento.

E

O que o Vinigodoy lhe sugeriu é a famosa “média móvel”. Você pode ver um exemplo disso se pedir um gráfico de velocidade de transmissão no Wireshark (recentemente tive de usar esse gráfico).
Se quiser algo que é mais fácil de calcular (no sentido que você não precisa guardar os últimos N dados mas sim apenas um), use um troço chamado “média móvel exponencial”.
Embora ela seja muito usada para análise de cotações de ações na Bolsa ( procurar por “média móvel exponencial” vai realmente lhe voltar um gráfico usado para esse tipo de análise) essa “média móvel exponencial” pode também ser usada para medir velocidades e tempos aproximados de conclusão.

http://pt.wikibooks.org/wiki/Logística/Técnicas_de_previsão/Alisamento_exponencial

fabriciov

Muito Obrigado, consegui resolver.
por não ter muito tempo para a entrega fiz como o ViniGodoy disse mesmo, se sobrar tempo vou dar uma olhada na media móvel exp.

Criado 28 de março de 2013
Ultima resposta 28 de mar. de 2013
Respostas 6
Participantes 4