• Chrome高性能的秘密:DNS预解析

    还未点击DNS解析已经完成
    服务器君一共花费 21.488 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    Chrome Predictor 的预测功能优化

    Chrome 会随着使用变得更快,它这个特性是通过一个单例对象 Predictor 来实现的。这个对象在浏览器内核进程(Browser Kernel Process)中实例化,它唯一的职责就是观察和学习当前网络活动方式,提前预估用户下一步的操作。下面是一个示例:

    用户将鼠标停留在一个链接上,就预示着一个用户的偏好以及下一步的浏览行为。这时 Chrome 就可以提前进行 DNS Lookup 及 TCP 握手。用户的点击操作平均需要将近 200ms,在这个时间就可能处理完 DNS 和 TCP 相关的操作, 也就是省去几百毫秒的延迟时间。 当在地址栏(Omnibox/URL bar) 触发高可能性选项时,就同样会触发一个 DNS lookup 和 TCP 预连接(pre-connect),甚至在一个不可见的页签中进行预渲染(pre-render)!

    我们每个人都会有天天访问的网站,Chrome 会研究在这些页面上的子资源, 并且尝试进行预解析(pre-resolve),甚至可能会进行预加载(pre-fetch)以优化浏览体验。

    除了上面三项,还有很多。

    Chrome 会在你使用过程中学习 Web 的拓扑结构,而不单单是你的浏览模式。理想的话,它将为你省去数百毫秒的延迟, 更接近于即时页面加载的状态。正是为了这个目标,Chrome 投入了这些的核心优化技术。

    DNS 预解析(pre-resolve)

    • 提前解析主机地址,以减少 DNS 延迟 TCP 预连接(pre-connect) 提前连接到目标服务器,以减少 TCP 握手延迟资源预加载(prefetching) 提前加载页面的核心资源,以加载页面显示页面预渲染(prerendering)。
    • 提前获取整个页面和相关子资源,这样可以做到及时显示。
    • 每一个决策都包含着一个或多个的优化, 用来克服大量的限制因素. 不过毕竟都只是预测性的优化策略,如果效果不理想,就会引入多余的处理和网络传输。甚至可能会带来一些加载时间上的负体验。

    Chrome 如何处理这些问题呢?Predictor 会尽量收集各种信息,诸如用户操作,历史浏览数据,以及来自渲染引擎(render)和网络模块自身的信息。

    和 Chrome 中负责网络事务调度的 ResourceDispatcherHost 不同,Predictor 对象会针对用户和网络事务创建一组过滤器(filter):

    IPC channel filter 用来监控来自 render 进程的事务。 每个请求上都会加一个 ConnectInterceptor 对象,这样就可以跟踪网络传输的模式以及每一个请求的度量数据。

    渲染进程(render process)会在一系列的事件下发送消息到浏览器进程(browser process), 这些事件被定义在一个枚举(ResolutionMotivation)中以便于使用 (url_info.h):

    enum ResolutionMotivation { 
    	MOUSE_OVER_MOTIVATED, // 鼠标悬停. OMNIBOX_MOTIVATED, // Omni-box 建议进行解析. 
    	STARTUP_LIST_MOTIVATED, // 这是在前 10 个启动项中的资源. 
    	EARLY_LOAD_MOTIVATED, // 有时需要使用 prefetched 来提前建立连接。
    
      // 下面定义了预加载评估的方式,会由一个 navigation 变量指定. 
    	// referring_url_也需要同时指定. 
    	STATIC_REFERAL_MOTIVATED, // 外部数据库(External Database)建议进行解析。 
    	LEARNED_REFERAL_MOTIVATED, // 前一次浏览(prior navigation 建议进行解析. 
    	SELF_REFERAL_MOTIVATED, // 猜测下一个连接是不是需要进行解析.
    
      // … }; 
    

    通过这些给定的事件,Predictor 的目标就可以评估它成功的可能性, 然后再适时触发操作。每一项事件都有其成功的机率、优先级以及时间戳,这些可以在内部维护一个用优先级管理的队列,也是优化的一个手段。最终,对于这个队 列中发出的每一个请求的成功率,都可以被 Predictor 追踪到。基于这些数据,Predictor 就可以进一步优化它的决策。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
  2. [Python程序设计] Python语言概述 6 个条目
  3. [移动开发] Android 网络通信框架Volley 1 个条目
  4. [智力开发与知识管理] 整体性学习策略 9 个条目
  5. [移动开发] Android属性系统Property 9 个条目
  6. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  7. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  8. [Python程序设计] Tornado背景知识介绍 4 个条目
  9. [软件工程与项目管理] 呈现树的构建 13 个条目
  10. [Python程序设计] Django架构流程分析 7 个条目
  11. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  12. [移动开发] Android Studio里的Gradle 3 个条目
窗口 -- [博客]