Измерение скорости загрузки Java

Я работаю над загрузкой файла в программное обеспечение, это то, что у меня есть, оно успешно загружено, а также я могу получить прогресс, но все же осталась 1 вещь, которую я не знаю, как это сделать. Измерьте скорость загрузки. Я был бы признателен за вашу помощь. Спасибо. Это текущий код метода загрузки

    public void run()
    {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;
        try
        {
            URL url1 = new URL(url);
            out = new BufferedOutputStream(
            new FileOutputStream(sysDir+"\\"+where));
            conn = url1.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];
            int numRead;
            long numWritten = 0;
            double progress1;
            while ((numRead = in.read(buffer)) != -1)
            {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
                this.speed= (int) (((double)
                buffer.length)/8);
                progress1 = (double) numWritten;
                this.progress=(int) progress1;
            }
        }
        catch (Exception ex)
        {
            echo("Unknown Error: " + ex);
        }
        finally
        {
            try
            {
                if (in != null)
                {
                    in.close();
                }
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException ex)
            {
                echo("Unknown Error: " + ex);
            }
        }
    }

person Jesus David Gulfo Agudelo    schedule 12.06.2011    source источник


Ответы (3)


Так же, как вы измеряете что угодно.

System.nanoTime() возвращает Long, которое вы можете использовать для измерения того, сколько времени что-то занимает:

Long start = System.nanoTime();
// do your read
Long end = System.nanoTime();

Теперь у вас есть количество наносекунд, которое потребовалось для чтения X байтов. Сделайте математику, и у вас есть скорость загрузки.

Скорее всего, вы ищете байты в секунду. Следите за общим количеством прочитанных вами байтов, проверяя, не прошла ли одна секунда. По прошествии одной секунды определите скорость, основанную на том, сколько байтов вы прочитали за это время. Сбросить итог, повторить.

person Brian Roach    schedule 12.06.2011
comment
формула для преобразования времени, которое InputStream.read() в КБ-МБ-ГБ/с? Ответы помогают измерить время выполнения InputStream.read(). - person ; 24.06.2017

вот моя реализация

while (mStatus == DownloadStatus.DOWNLOADING) {
            /*
             * Size buffer according to how much of the file is left to
             * download.
             */
            byte buffer[];
            // handled resume case.
            if ((mSize < mDownloaded ? mSize : mSize - mDownloaded <= 0 ? mSize : mSize - mDownloaded) > MAX_BUFFER_SIZE) {
                buffer = new byte[MAX_BUFFER_SIZE];
            } else {
                buffer = new byte[(int) (mSize - mDownloaded)];
            }

            // Read from server into buffer.
            int read = stream.read(buffer);
            if (read == -1)
                break;// EOF, break while loop

            // Write buffer to file.
            file.write(buffer, 0, read);
            mDownloaded += read;
            double speedInKBps = 0.0D;
            try {
                long timeInSecs = (System.currentTimeMillis() - startTime) / 1000; //converting millis to seconds as 1000m in 1 second
                speedInKBps = (mDownloaded / timeInSecs) / 1024D;
            } catch (ArithmeticException ae) {

            }
            this.mListener.publishProgress(this.getProgress(), this.getTotalSize(), speedInKBps);
        }
person AZ_    schedule 19.11.2013

Я могу дать вам общее представление. Запустите таймер в начале загрузки. Теперь умножьте (percentage downloaded) на download size и разделите на time elapsed.. Это даст вам среднее время загрузки. Надеюсь, я направлю вас на правильный путь!

Вы можете использовать System.nanoTime();, как предложил Брайан.

Поместите long startTime = System.nanoTime(); вне цикла while. и

long estimatedTime = System.nanoTime() - startTime; даст вам прошедшее время в вашем цикле.

person Anirudh Ramanathan    schedule 12.06.2011
comment
Я не знаю, как это добавить, у меня есть таймер для получения прогресса, но в графическом интерфейсе - person Jesus David Gulfo Agudelo; 12.06.2011
comment
Поместите long startTime = System.nanoTime(); вне цикла while. и long estimatedTime = System.nanoTime() - startTime; даст вам текущее время - person Anirudh Ramanathan; 12.06.2011
comment
Да пробовал вот так long startTime = System.nanoTime();, снаружи пока, и Long end = System.currentTimeMillis()*1000; внутри, после записи в буфер, но вроде работает только один раз?, еще добавил вот это speed= (int) ((1024/(double) (start-end)));, потому что в буфере 1024 байта - person Jesus David Gulfo Agudelo; 12.06.2011
comment
@JesusDavidGulfoAgudelo, привет, я ищу то же самое. Ваш код работал после того, как вы указали комментарий выше. - person Amogh; 20.12.2014