如何优化网络队列走在安卓排球? (排球谷歌IO 2013) [英] How to optimize network-queue-take in android Volley? (Volley Google IO 2013)

查看:116
本文介绍了如何优化网络队列走在安卓排球? (排球谷歌IO 2013)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是排球记录的图像请求的快照。几乎一半的渲染时间是由于网络队列走。另一种是更为显着高,大部分时间都在网络队列采取之中。这怎么优化,使网络队列采取的是更快?是什么决定(不是线程的优先级等,图像请求默认情况下低优先级的请求),速度的网络队列走?

注:我跑这对三星Galaxy S4

  11月八日至7号:01:09.560:D /排球(938):[1] MarkerLog.finish:(3662毫秒)[] HTTP://farm6.static.flickr .COM / 5487 / 9452149004_c4ba6d2d97_t.jpg 0x8da7e4ac低84
11月8号至7日:01:09.560:D /排球(938):[1] MarkerLog.finish:(+0)[1]加入到队列
11月8号至7日:01:09.565:D /排球(938):[1] MarkerLog.finish:(+0)[12239]缓存队列走
11月8号至7日:01:09.565:D /排球(938):[1] MarkerLog.finish:(+0)[12239]高速缓存未命中
11月8号至7日:01:09.570:D /排球(938):[1] MarkerLog.finish:(1694)[12243]网络队列走
11月8号至7日:01:09.570:D /排球(938):[1] MarkerLog.finish:(1852)[12243]网络HTTP完成
11月8号至7日:01:09.570:D /排球(938):[1] MarkerLog.finish:(+50)[12243]网络解析完成
11月8号至7号:01:09.575:D /排球(938):[1] MarkerLog.finish:(21)[12243]网络高速缓存写
11月8号至7日:01:09.575:D /排球(938):[1] MarkerLog.finish:(+0)[12243]后的反应
11月8号至7日:01:09.580:D /排球(938):[1] MarkerLog.finish:(+45)[1]就可以完成
 

下面是另外一个需要更长的时间:

  11月八日至7号:01:09.845:D /排球(938):[1] MarkerLog.finish:(3871毫秒)[] HTTP://farm3.static.flickr .COM / 2827 / 9451437485_921584cdea_t.jpg 0x24a8bf69低85
11月8号至7日:01:09.860:D /排球(938):[1] MarkerLog.finish:(+0)[1]加入到队列
11月8号至7日:01:09.865:D /排球(938):[1] MarkerLog.finish:(+1)[12239]缓存队列走
11月8号至7日:01:09.870:D /排球(938):[1] MarkerLog.finish:(+0)[12239]高速缓存未命中
11月8号至7日:01:09.870:D /排球(938):[1] MarkerLog.finish:(2543)[12242]网络队列走
11月8号至7日:01:09.875:D /排球(938):[1] MarkerLog.finish:(1280)[12242]网络HTTP完成
11月8号至7日:01:09.880:D /排球(938):[1] MarkerLog.finish:(+26)[12242]网络解析完成
11月8号至7号:01:09.885:D /排球(938):[1] MarkerLog.finish:(14)[12242]网络高速缓存写
11月8号至7日:01:09.885:D /排球(938):[1] MarkerLog.finish:(+0)[12242]后的反应
11月8号至7日:01:09.890:D /排球(938):[1] MarkerLog.finish:(+7)[1]就可以完成
11月8号至7日:01:09.905:D / dalvikvm(938):GC_CONCURRENT释放973K,免费11%14796K / 16583K,暂停12毫秒+ 6ms的,总56MS
 

解决方案

网络队列取需要时间,因为你有大量的运行要求。如果您有(默认)4个线程中运行,8请求,说所有的第一次请求采取完全500毫秒那么网络队列走对剩余的请求,将500毫秒,因为它等待500毫秒获得队列中的位置。

您可以消灭它创造了一个更高的请求队列超过defualt DEFAULT_NETWORK_THREAD_POOL_SIZE,但请记住,默认是有原因的。例如,在您下载20幅图像在同一时间,你能碰到OOM条件。不过,如果你有大量的内存不足,而坏的等待时间要求,增加它应该得到更好的性能,而不用担心OOM条件。

Below is a snapshot of the Volley logs for an image request. Almost half of the rendering time is due to network-queue-take. Another one is even more dramatically high, the bulk of the time being in the network-queue-take. How can this be optimized so that network-queue-take is faster? What determines (other than thread priority, image requests are by default LOW priority requests), the speed of the network-queue-take?

Note: I ran this on Samsung Galaxy S4.

08-07 11:01:09.560: D/Volley(938): [1] MarkerLog.finish: (3662 ms) [ ]    http://farm6.static.flickr.com/5487/9452149004_c4ba6d2d97_t.jpg 0x8da7e4ac LOW 84
08-07 11:01:09.560: D/Volley(938): [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
08-07 11:01:09.565: D/Volley(938): [1] MarkerLog.finish: (+0   ) [12239] cache-queue-take
08-07 11:01:09.565: D/Volley(938): [1] MarkerLog.finish: (+0   ) [12239] cache-miss
08-07 11:01:09.570: D/Volley(938): [1] MarkerLog.finish: (+1694) [12243] network-queue-take
08-07 11:01:09.570: D/Volley(938): [1] MarkerLog.finish: (+1852) [12243] network-http-complete
08-07 11:01:09.570: D/Volley(938): [1] MarkerLog.finish: (+50  ) [12243] network-parse-complete
08-07 11:01:09.575: D/Volley(938): [1] MarkerLog.finish: (+21  ) [12243] network-cache-written
08-07 11:01:09.575: D/Volley(938): [1] MarkerLog.finish: (+0   ) [12243] post-response
08-07 11:01:09.580: D/Volley(938): [1] MarkerLog.finish: (+45  ) [ 1] done

Here is another one that takes even longer:

08-07 11:01:09.845: D/Volley(938): [1] MarkerLog.finish: (3871 ms) [ ] http://farm3.static.flickr.com/2827/9451437485_921584cdea_t.jpg 0x24a8bf69 LOW 85
08-07 11:01:09.860: D/Volley(938): [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
08-07 11:01:09.865: D/Volley(938): [1] MarkerLog.finish: (+1   ) [12239] cache-queue-take
08-07 11:01:09.870: D/Volley(938): [1] MarkerLog.finish: (+0   ) [12239] cache-miss
08-07 11:01:09.870: D/Volley(938): [1] MarkerLog.finish: (+2543) [12242] network-queue-take
08-07 11:01:09.875: D/Volley(938): [1] MarkerLog.finish: (+1280) [12242] network-http-complete
08-07 11:01:09.880: D/Volley(938): [1] MarkerLog.finish: (+26  ) [12242] network-parse-complete
08-07 11:01:09.885: D/Volley(938): [1] MarkerLog.finish: (+14  ) [12242] network-cache-written
08-07 11:01:09.885: D/Volley(938): [1] MarkerLog.finish: (+0   ) [12242] post-response
08-07 11:01:09.890: D/Volley(938): [1] MarkerLog.finish: (+7   ) [ 1] done
08-07 11:01:09.905: D/dalvikvm(938): GC_CONCURRENT freed 973K, 11% free 14796K/16583K, paused 12ms+6ms, total 56ms

解决方案

network-queue-take is taking time because you have a high number of requests running. If you have (by default) 4 threads running, and 8 requests, say all the first requests take exactly 500ms then the network-queue-take for the remaining requests will be 500ms, as it's waited 500ms to get a spot in the queue.

You can "eliminate" it by creating a RequestQueue with a higher than defualt DEFAULT_NETWORK_THREAD_POOL_SIZE, but keep in mind the default is there for a reason. If you for example download 20 images at the same time you can run into OOM conditions. However if you have a large number of low memory, and bad latency requests, increasing it should help your performance without risking oom conditions.

这篇关于如何优化网络队列走在安卓排球? (排球谷歌IO 2013)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆