Почему время отклика (для Rest Call) медленнее в Android по сравнению с ПК?
Я делаю вызов api для отдыха с устройства Android и был очень удивлен, глядя на разницу скоростей по сравнению с ПК.
Ниже приведено изображение из инструмента отдыха на ПК. ![enter image description here]()
Я попробовал несколько библиотек, таких как Retrofit, Volley, а также обычную задачу Async, чтобы сделать тот же самый вызов для отдыха с устройства Android и заметил следующее время ответа.
(Response times with Retrofit library (Time includes converting json data to java objects)).
Test 1: 8372 Ms
Test 2: 7715 Ms
Test 3: 7686 Ms
Test 4: 10128 Ms
Test 5: 7876 Ms
(Response times with Volley. No conversion to Java Objects from Json Data )
Test 1: 6721 MS
Test 2: 6610 MS
Test 3: 6287 MS
Test 4: 6118 MS
Test 5: 6118 MS
Я взял System.currentTimeMillis()
перед тем, как позвонить, и после получения ответа и вычитал эти значения, чтобы получить время отклика в программе Android.
Было бы очень полезно, если кто-то может показать мне, как уменьшить время отклика в андроиде.
FYI: я нахожусь на Wi-Fi и использую ту же сеть как для своего ПК, так и для Android-устройств.
Вот обновленный Android-код
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint(ENDPOINT)
.build();
WeatherApi weatherApi = adapter.create(WeatherApi.class);
startTime = System.currentTimeMillis();
weatherApi.getWeather(location.getLatitude(),location.getLongitude(),new Callback<WeatherInfo>() {
@Override
public void success(WeatherInfo arg0, Response arg1) {
endTime = System.currentTimeMillis();
Log.d("TAG",endTime-startTime + ":Millisecs");
setWeatherInfo(arg0);
if(weatherDialog != null && weatherDialog.isShowing())
weatherDialog.dismiss();
}
Ответы
Ответ 1
Дооснащение не зависит от HTTP-клиента, который он использует, поэтому он пытается выяснить, какой лучший доступный HTTP-клиент он может использовать для выполнения запроса.
По умолчанию Retrofit использует GSON в качестве конвертера (это тоже можно настроить). Учитывая, что GSON использует отражение для сопоставления элементов JSON с вашими атрибутами класса, сложность класса WeatherInfo
может очень сильно снизить производительность на этапе преобразования.
Поскольку различия в вашем случае не совсем разумны, я думаю, что GZIP отключен. Вы можете использовать RestAdapter.setLogLevel(LogLevel.FULL)
и проверить заголовок Accept-Encoding
, чтобы узнать, включен ли GZIP или нет. Если это не так, отправляйте более релевантный код, чтобы мы могли дать больше информации.
Быстрый способ, который, я уверен, вы заметите огромную разницу, если вы включите okhttp и okhttp-urlconnection - когда они доступны в пути к классам, Retrofit будет использовать okhttp в качестве клиента по умолчанию, который поддерживает GZIP без каких-либо дальнейшая конфигурация.
Вы можете сделать это, добавив следующие зависимости в файл build.gradle:
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
Обратите внимание, что сжатие также должно поддерживаться на стороне сервера, и я не уверен, что вы опубликовали полный вывод заголовков ответов, но, похоже, отсутствует что-то вроде Content-Encoding: gzip
, если это в этом случае вы должны изучить возможность включения этой функции на свой веб-сервер.
Ответ 2
Мое предположение: ваша система Android либо перегружена, либо находится под отладчиком, либо там создается компиляция dalvik vm.
Как раз в то же время, как и 6 секунд, понимается, что существует определенное физическое ограничение, такое как загрузка процессора или доступ к памяти SDHC.
Также, если вы используете эмулятор для отладки, это может быть причина.