2015-05-21 6 views
17

Wykonuję apkę rest api z urządzenia z systemem Android i byłem naprawdę zaskoczony, patrząc na różnicę prędkości w porównaniu do komputera. Poniżej znajduje się obraz z narzędzia odpoczynku na komputerze. enter image description hereDlaczego czas reakcji (dla odpoczynku) jest wolniejszy w systemie Android w porównaniu do komputera?

Próbowałem kilka bibliotek, takich jak Retrofit, Volley, a także regularne zadanie Async, aby wykonać to samo reszta połączenia z urządzenia z Androidem i zauważyłem następujące czasy odpowiedzi.

(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 

Wziąłem System.currentTimeMillis() przed nawiązaniem połączenia, a po uzyskaniu odpowiedzi i odjąć te wartości, aby uzyskać nad czasem reakcji w programie Android.

Byłoby bardzo pomocne, gdyby ktoś mógł mi pokazać, jak skrócić czas reakcji w systemie Android.

FYI: Korzystam z sieci Wi-Fi i korzystam z tej samej sieci zarówno na moim komputerze, jak i urządzeniu z systemem Android.

Oto kod Modernizacja systemem 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

Czy jesteś pewien, że nie mierzysz czasu po przetworzeniu wyniku połączenia, zamiast czasu, aby uzyskać odpowiedź z serwera?Może warto byłoby opublikować swój kod, aby pokazać, gdzie robisz timingy? –

+0

@EdGeorge zaktualizowano kodem – Prakash

+0

Między początkiem i czasem zakończenia istnieje proces konwersji odpowiedzi JSON na obiekt 'WeatherInfo'. Podane czasy będą zawierać dodatkowy czas konwersji. Jak duże jest ciało, z którego wróciłeś i czy możesz opublikować klasę POO O WeatherInfo, której używasz? –

Odpowiedz

4

Modernizacja jest agnostykiem do klienta HTTP to wykorzystuje, więc próbuje dowiedzieć się, co jest najlepszym klientem HTTP można go używać do wykonywania żądania.

Domyślnie Retrofit używa GSON jako konwertera (który również można dostosować). Biorąc pod uwagę, że GSON używa refleksji do odwzorowania elementów JSON na atrybuty twojej klasy, złożoność klasy WeatherInfo może bardzo dobrze wpływać na wydajność w etapie konwersji.

Ponieważ różnice w Twojej sprawie nie są całkiem uzasadnione, moim zdaniem GZIP jest wyłączony. Możesz użyć RestAdapter.setLogLevel(LogLevel.FULL) i sprawdzić nagłówek Accept-Encoding, aby sprawdzić, czy GZIP jest włączony, czy nie. Jeśli tak nie jest, opublikuj bardziej odpowiedni kod, abyśmy mogli uzyskać więcej informacji.

Szybki sposób, który na pewno zauważysz, że ogromna różnica polega na tym, że dołączasz okhttp i okhttp-urlconnection - gdy są one dostępne w ścieżce klasy, Retrofit użyje domyślnie okhttp jako klienta, który obsługuje GZIP bez jakakolwiek dalsza konfiguracja.

Można to zrobić przez dodanie następujących zależności do pliku build.gradle:

compile 'com.squareup.okhttp:okhttp:2.4.0' 
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' 

Należy pamiętać, że kompresja ma również być wspierane na stronie serwera, a nie jestem pewien, czy” opublikowano kompletne dane wyjściowe nagłówków odpowiedzi, ale wydaje się, że brakuje czegoś takiego, jak Content-Encoding: gzip, jeśli tak jest w przypadku, gdy powinieneś rozważyć włączenie tej funkcji również na swoim serwerze sieciowym.

1

Domyślam się, że twój system android jest przeciążony lub znajduje się pod debuggerem, albo działa tam kompilacja dalvik vm.

Po upływie 6 sekund rozumie się, że istnieje pewne ograniczenie fizyczne, takie jak obciążenie procesora lub dostęp do pamięci SDHC.

Także jeśli używasz emulatora do debugowania, może to jest powodem.

Powiązane problemy