#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
.