• 提升 web 应用程序的性能(二)


    最佳实践

    本章将略述能帮助您提升 web 应用程序性能的最佳实践。

    减少 HTTP 请求数

    每个 HTTP 请求都有开销,包括查找 DNS、创建连接及等待响应,因此削减不必要的请求数可减少不必要的开销。要减少请求数:

    • 合并文件。将总是同时使用的脚本合并到同一个文件中,不会减小总大小,但将会 减少请求数。还可以同样方法合并 CSS 文件和图片。可以实现文件自动合并:
      • 在构建阶段。用 <concat > 标记,通过运行 Ant 合并文件。
      • 在运行时阶段。启用 mod_concat 模块。如果 httpServer 是 Apache,用 pack:Tag 作为 JSP 标签库来合并 JavaScript 和样式表文件。(pack:Tag 是一个 JSP-Taglib,可缩减、压缩及合并资源,如 JavaScript 和 CSS,并将它们在内容或普通文件中缓存。)
    • 使用 CSS Sprites。将背景图片合并成一个图片,并使用 CSS background-image 和 background-position 属性来显示所需图片部分。还可使用内联图片减少请求数。

    后置加载组件

    只呈现需要的组件;其余可等待。最好不要一次呈现太多组件。

    某些情况下,可使用后置加载。由于浏览器可视区域外的组件可以后置加载,当这些组建进入可视区域不久后,初始呈现就会失效。

    有些 JavaScript 可以在 onload 事件后后置加载,如 JavaScript 中初始呈现后拖动某个元素。

    前置加载组件

    通过前置加载组件,可以利用浏览器的空闲时间请求将来会用到的组件(如图像、样式和脚本)。当用户访问下个页面时,如果大多数组件都已在缓存中加载,那页面加载会快得多。

    有两种前置加载:

    • 无条件:一旦触发 onload,就取得一些额外组件。
    • 有条件:根据用户的动作,推测用户下一步的方向并进行相应的前置加载。

    将脚本放在底部

    脚本可能会产生问题,因为它们可能会阻碍并行下载。当下载脚本时,浏览器不会再启动其他下载 — 即使那些位于不同主机。将脚本,如样式表,放在底部,以保证它们在其他下载完成后再下载。

    也可以使用延时脚本,这只有 Internet Explorer 支持。DEFER 属性表示脚本不含 document.write()。这就告诉浏览器他们可以持续呈现。

    使用无 cookie 域组件

    当浏览器发出对静态图片的请求,并随之发送 cookie 时,服务器不会使用那些 cookie。由于这些 cookie 只会造成不必要的网络流量,确保用无请求来请求静态组件。然后使用子域和主机保存这些静态组件。

    将 JavaScript 和 CSS 放在外部

    现实世界中使用外 部文件通常会使页面运行更快,因为 JavaScript 和 CSS 文件被浏览器缓存。HTML 文档内联的 JavaScript 和 CSS 会在每次请求 HTML 文档时被下载。这减少了需要请求的 HTTP 的数量,但增加了 HTML 文档的大小。另一方面,如果 JavaScript 和 CSS 在被浏览器缓存的外部文件中,就会减小 HTML 文档大小,而不会增加请求数。

    YSlow

    YSlow 根据一组高性能 web 页面准则,通过检查页面上所有组件,包括由 JavaScript 创建的,来分析 web 页面性能。YSlow 是一个集成了 Firebug web 开发工具的 Firefox 插件;它可提供提升页面性能的建议、总结组件性能、显示页面统计数据并提供用于性能分析的工具。

    图 3 显示的是 YSlow Grade 选项卡上的信息。

    图 3. YSlow Grade 选项卡
    YSlow Grade 面板是 Firefox 插件的一部分

    YSlow 的 web 页面建立在 22 条可测试的规则基础上,这些规则在下方按重要性和效果排列。研究显示,按照以下规则,web 页面响应时间可提升 25% 到 50%:

    • 尽量减少 HTTP 请求数。
    • 使用内容发布网络(CDN)。
    • 添加 Expires 或 Cache-Control 头部。
    • 用 Gzip 压缩内容。
    • 将样式表放在顶部。
    • 将脚本放在底部。
    • 避免使用 CSS 表达式。
    • 将 JavaScript 和 CSS 放在外部。.
    • 减少 DNS 搜索。
    • 精简 JavaScript 和 CSS。
    • 避免使用重定向。
    • 删除重复的脚本。
    • 配置 ETags。
    • 使 Ajax 可缓存。
    • 使用 GET 进行 Ajax 请求。
    • 减少 DOM 元素数。
    • 消除 404 错误。
    • 减小 cookie 大小。
    • 对组件使用无 cookie 的域。
    • 避免使用过滤器。
    • 不在 HTML 中测量图片大小。
    • 使 favicon.ico 尽可能小,可缓存。
  • 相关阅读:
    BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )
    BZOJ 1040: [ZJOI2008]骑士( 树形dp )
    BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )
    HDU 5667 Sequence 矩阵快速幂
    FZU 2225 小茗的魔法阵 扫描线+树状数组
    UVA 11916 Emoogle Grid 离散对数 大步小步算法
    UVA 11754 Code Feat 中国剩余定理+暴力
    FZU 2092 收集水晶 dp+bfs
    FZU2090 旅行社的烦恼 巧妙floyd 最短路
    UVA 11426 GCD
  • 原文地址:https://www.cnblogs.com/wuxiang/p/4425530.html
Copyright © 2020-2023  润新知