Слишком низкая скорость с реализованным тестом скорости в Android/Java

#java #android #flutter

Вопрос:

Я пытаюсь реализовать тест скорости, загрузив файл в Android через http. Мои результаты всегда составляют около 30 Мбит / с, хотя тест скорости Ookla измеряет 60-100 Мбит / с. Размер файла составляет 100 МБ. Я попробовал несколько источников, которые должны обеспечивать достаточную пропускную способность.

 public void run() {
    long count = 0;
    long start = Long.MAX_VALUE;
    long end;
    try {
        InputStream in = new URL("source").openStream();
        byte[] dataBuffer = new byte[2048];
        int bytesRead;
        start = System.nanoTime();
        while ((bytesRead = in.read(dataBuffer, 0, 2048)) != -1) {
            count  = 2048;
        }
    } catch (IOException ignored) {
    } finally {
        end = System.nanoTime();
    }

    System.out.println(count / 125000);
    System.out.println(end - start);
    System.out.println((count / 125000.0) / ((end - start) / 1000000000.0));
}
 

ПРАВКА: Я установил ограничение в 15 Мбит/с для своего смартфона, и теперь алгоритм работает без проблем… но я все еще не знаю, почему он захватывает только до 30 Мбит / с при пропускной способности ниже 100 Мбит / с. На самом деле это не может быть проблемой с производительностью, так как он захватывает 150 Мбит / с при пропускной способности 1 Гбит / с.

Комментарии:

1. Оокла, вероятно, предполагает, что вы хотите знать, как ваша фактическая скорость сравнивается с тем, что рекламирует ваш интернет-провайдер. Но что ваш интернет — провайдер учитывает в своих измерениях? Я на самом деле не уверен, но вы можете поспорить, что они (и Оокла тоже) учитывают каждый отправленный бит, включая все заголовки нижнего уровня (заголовки TCP, IP-заголовки, уровень ссылок и т. Д.). Вы измеряете только полезную нагрузку TCP и игнорируете все остальное. Однако для большого файла и типичной конфигурации сети я ожидал бы, что разница составит всего несколько процентов, а не 100%, поэтому, в конце концов, я действительно не знаю, почему разница так велика.

2. Спасибо за ответ. Вы правы, и я бы не удивился меньшему отклонению. Тем не менее, тест, по-видимому, измеряет относительно точно, но уже не с 30 Мбит / с. Как будто это была верхняя граница в Android. Я также реализовал его в Dart с тем же результатом.

3. count = 2048; Это должно count = bytesRead; занять больший буфер, например 8192.

4. Я знаю. Я изменил это, потому что подумал, что это может быть ошибкой. Но это в лучшем случае исправило бы результат вниз, а не вверх. Я попробую увеличить буфер

5. Попробуйте завернуть в BufferedInputStream .