Подтвердить что ты не робот

Почему время отклика (для 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();
        }
4b9b3361

Ответ 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.

Также, если вы используете эмулятор для отладки, это может быть причина.