我正在通过Android设备进行休息api通话,并且与PC相比,看到速度的差异真的很惊讶。 以下是来自PC上的休息工具的图像。
我尝试了很少的库,比如Retrofit,Volley以及常规的异步任务来从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程序中获得超过响应时间。
如果有人能告诉我如何减少android中的响应时间,那将非常有用。
仅供参考:我正在使用Wifi并在我的PC和Android设备上使用相同的网络。
这是Retrofit 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();
}
答案 0 :(得分:4)
Retrofit与它使用的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
之类的内容,如果是这种情况,您应该考虑在您的Web服务器上启用此功能。
答案 1 :(得分:1)
我的猜测是你的android系统过载或调试器或dalvik vm编译在那里生效。
在6秒钟之内就可以理解存在一些物理限制,例如CPU负载或SDHC内存访问。
此外,如果您使用模拟器进行调试,这可能是原因。