Page 140 - Web性能权威指南
P. 140

8.2 消除周期性及无效的数据传输


               我们知道,无论传输多少数据,移动无线通信总会消耗恒定电量,从而导致无线模
               块进入高功率状态。因此,对于耗电而言,根本不存在什么“耗电少的请求”(参见
               7.3.5 节“低效率的周期性传输”)。那么,进一步归纳就可以得到如下规则:

               •   轮询在移动网络中代价极高,少用;
               •   尽可能使用推送和通知;
               •   出站和入站请求应该合并和汇总;
               •   非关键性请求应该推迟到无线模块活动时进行。
               一般来说,推送比轮询效果更好。但频率过高的推送与轮询也不相上下。如果碰到
               实时更新的需求,应该考虑下列问题。

               •   最佳更新间隔多长,是否符合用户预期?
               •   除了固定的更新间隔,能否因地因时制宜?
               •   入站或出站请求能否集合为更少的网络调用?
               •   入站或出站请求能否推迟到以后发送?


                          对推送而言,原生应用可以访问平台专有的推送服务,因此应该尽可能使
                          用。对 Web 应用来说,可以使用 SSE(Server  Sent  Events,服务器发送事
                          件)和 WebSocket 以降低延迟时间和协议消耗,尽可能不使用轮询和更耗
                          资源的 XHR 技术。


               基于时间间隔、环境、用户偏好,甚至电池电量,简单地把多个通知集合到一个推
               送事件中,可以显著提升任何应用的电池效率。后台应用尤其适合这一策略,因为
               它们经常要以这种方式访问网络。


                                     内格尔及有效的服务器推送

                因为有内格尔(Nagle)算法,TCP 的拥趸一定会认可请求聚合和绑定的建议,当
                然不是在应用层!内格尔算法尝试将多个 TCP 消息组合为一个分组,以期减少协
                议消耗和需要传输的分组数量。不用说,移动应用同样是这一技术的用武之地。

                简单的策略是,可以在服务器上根据时间、数量或大小来聚合消息,而不是每个
                消息都单独推送一次。但更深入也更有效的做法,则是只在客户端的无线模块活
                动期间推送更新。比如,把消息推迟到客户端发送请求之后再发送,可以利用那
                些能够监控客户端无线状态的服务。





               124   |   第 8 章
   135   136   137   138   139   140   141   142   143   144   145