Page 140 - Web性能权威指南
P. 140
8.2 消除周期性及无效的数据传输
我们知道,无论传输多少数据,移动无线通信总会消耗恒定电量,从而导致无线模
块进入高功率状态。因此,对于耗电而言,根本不存在什么“耗电少的请求”(参见
7.3.5 节“低效率的周期性传输”)。那么,进一步归纳就可以得到如下规则:
• 轮询在移动网络中代价极高,少用;
• 尽可能使用推送和通知;
• 出站和入站请求应该合并和汇总;
• 非关键性请求应该推迟到无线模块活动时进行。
一般来说,推送比轮询效果更好。但频率过高的推送与轮询也不相上下。如果碰到
实时更新的需求,应该考虑下列问题。
• 最佳更新间隔多长,是否符合用户预期?
• 除了固定的更新间隔,能否因地因时制宜?
• 入站或出站请求能否集合为更少的网络调用?
• 入站或出站请求能否推迟到以后发送?
对推送而言,原生应用可以访问平台专有的推送服务,因此应该尽可能使
用。对 Web 应用来说,可以使用 SSE(Server Sent Events,服务器发送事
件)和 WebSocket 以降低延迟时间和协议消耗,尽可能不使用轮询和更耗
资源的 XHR 技术。
基于时间间隔、环境、用户偏好,甚至电池电量,简单地把多个通知集合到一个推
送事件中,可以显著提升任何应用的电池效率。后台应用尤其适合这一策略,因为
它们经常要以这种方式访问网络。
内格尔及有效的服务器推送
因为有内格尔(Nagle)算法,TCP 的拥趸一定会认可请求聚合和绑定的建议,当
然不是在应用层!内格尔算法尝试将多个 TCP 消息组合为一个分组,以期减少协
议消耗和需要传输的分组数量。不用说,移动应用同样是这一技术的用武之地。
简单的策略是,可以在服务器上根据时间、数量或大小来聚合消息,而不是每个
消息都单独推送一次。但更深入也更有效的做法,则是只在客户端的无线模块活
动期间推送更新。比如,把消息推迟到客户端发送请求之后再发送,可以利用那
些能够监控客户端无线状态的服务。
124 | 第 8 章