Java Как рассчитать Мбит / с во время загрузки цикла - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть while loop загрузка файла

while ((val = bis.read(buffer, 0, 1024)) > 0) {
   out.write(buffer, 0, val);
   fileSize -= val;
   if (fileSize < 1024) {
   val = (int) fileSize;
}

Попытка выяснить, как показывать Мбит / с, как это делают многие скоростные сайты. (Ссылка)
http://www.speedtest.net/ ,

Хотел бы, чтобы месурмент остался внутри петли while, но у меня есть
видел примеры использования стрельбы по минутам, но я не знаю ..

Я не знаю объем данных, или данные всегда 1024.
вот о проблемах я думаю
Любая помощь это решетка?

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

Я могу ошибаться на порядок или два, по общему мнению:

long start = System.nanoTime();
long totalRead = 0;
final double NANOS_PER_SECOND = 1000000000.0;
final double BYTES_PER_MIB = 1024 * 1024;

while ((val = bis.read(buffer, 0, 1024)) > 0) {
    //...
    totalRead += val;
    double speedInMBps = NANOS_PER_SECOND / BYTES_PER_MIB * totalRead / (System.nanoTime() - start + 1);
    double speedInMbps = speed * 8;
}

Обратите внимание, что это вычисляет среднюю скорость с начала, а не текущую скорость.

4 голосов
/ 16 ноября 2011

Я предполагаю, что этот цикл не выполняется в потоке пользовательского интерфейса. Объявите две переменные экземпляра в вашем классе:

volatile long totalDownloaded;
long downloadStartTime;

Измените код вашего цикла следующим образом:

totalDownloaded = 0L;
downloadStartTime = System.currentTimeMillis();
while ((val = bis.read(buffer, 0, 1024)) > 0) {
   out.write(buffer, 0, val);
   totalDownloaded += val;
   fileSize -= val;
   if (fileSize < 1024) {
   val = (int) fileSize;
}

Запланируйте задачу на выполнение в потоке пользовательского интерфейса так часто, чтобы вычислять System.currentTimeMillis() - downloadStartTime и использовать прошедшее время и текущее значение totalDownloaded, чтобы вычислить среднюю скорость загрузки и обновить отображение. Вы можете сделать все это отдельным методом в том же классе:

/**
 * Returns average download speed in bytes/second.
 */
public float getDownloadSpeed() {
    long elapsedTime = System.currentTimeMillis() - downloadStartTime;
    return 1000f * totalDownloaded / elapsedTime;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...