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

“实时”对不同的应用有不同的含义:有些应用要求毫秒级的精确度,而
                            有些应用可能只要几分钟同步一次就够了。要确定最佳的传输方式,首先
                            必须明确自己应用的延迟和性能目标!


                 15.7.1 通过XHR实现轮询

                 从服务器取得更新的一个最简单的办法,就是客户端在后台定时发起 XHR 请求,
                 也就是轮询(polling)。如果服务器有新数据,返回新数据,否则返回空响应。

                 轮询实现起来简单,但也经常效率很低。其中关键在于选择轮询间隔:长轮询间隔
                 意味着延迟交付,而短轮询间隔会导致客户端与服务器间不必要的流量和协议开销。
                 下面看一个简单的例子:

                     function checkUpdates(url) {
                       var xhr = new XMLHttpRequest();
                       xhr.open('GET', url);
                       xhr.onload = function() { ... }; ➊
                       xhr.send();
                     }

                     setInterval("checkUpdates('/updates'), 60000"); ➋

                 ➊ 处理从服务器收到的更新
                 ➋ 每 60 秒发送一个 XHR 请求

                 •   每个 XHR 请求都是一次独立的 HTTP 请求,平均算下来,每个 HTTP 会带有大
                   约 800 字节的请求 / 响应首部(不算 HTTP cookie)。
                 •   定时检查很有效,前提是数据能按时到达。可惜的是,按时到达只是例外,而非
                   常规情形。于是,定时轮询也会导致服务器端消息可用与交付给客户端之间的额
                   外延迟。
                 •   除非考虑周到,否则轮询对于无线网络来说常常会变成性能杀手(参见 8.2 节“消

                   除周期性及无效的数据传输”)。唤醒无线电模块会消耗很多电量!

                 最佳的轮询间隔是多少?没有唯一的答案。轮询频率取决于应用的需要,而且始终
                 都会存在关于效率和消息延迟的权衡。所以说,轮询最适合间隔时间长,新事件到
                 达时间有规律,且传输数据量大的场景。这个组合可以抵消多余的 HTTP 开销,并
                 将消息交付的延迟最小化。









                                                                       XMLHttpRequest    |   237
   245   246   247   248   249   250   251   252   253   254   255