网站性能
---

网站性能直接影响到了网站的响应时间、吞吐量等等，也是运维、开发一系列技术的体现。

###网站性能监测

网站性能监测

> 网站可用性是网站性能监测的重要指标之一，表示在一段时间内，网站处于“正常状态”的机率。

 - DNS 解析
 - 内存、硬盘等等
 - 网页打开速度

####应用性能指数

> Apdex 联盟，一个由众多网络分析技术公司和测量工业组成的联盟组织，它们联合起来开发了“应用性能指数”即“Apdex”(Application Performance Index)，用一句话来概括，Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告用户体验的方法，第一次把最终用户的体验和应用性能联系在了一起。

任务响应时间定义为：当用户操作（鼠标点击、输入、回车）开始到系统（客户机、网络、服务器）响应从而用户能继续这个过程所经过的时间。这些等待时间定义了应用程序的“响应度”。该指数是基于应用程序响应度的三个方面：

 - 满意:用户充分工作。这就是目标时间（T秒），即在此时间里用户的工作没有因应用程序的响应时间而受阻，如3秒。
 - 容忍:用户感觉到响应滞后，响应时间大于 T，但能继续这个过程，如3～12秒。
 - 挫折:响应时间大于 F 秒的性能是不能接受的，用户可能放弃这个过程。F 等于 T×4，在本例子中为12秒。


###网站性能

针对网站性能优化领域，网上已经有相当多的总结，这里只罗列一些常见（我用过）的策略。

#####减少 HTTP 请求

从网上查找的情况分类来看，有下面的一些情况：

 - 合并 JavaScript 和 CSS。只是这种方式需要好好评估，因为合并过多的 JavaScript，可能会导致 JavaScript 文件过大。一个大的文件将增加 Load时间，导致不好的用户体验。
 - CSS Sprites。即将一个页面涉及到的所有零星图片都包含到一张大图中去。值得注意的是，像 Logo 这一类文件将不要加到里面去了。
 - 拆分初始化负载。将页面加载时需要的一堆 JavaScript 文件，分成两部分：渲染页面所必需的和其他的。页面初始化时，只加载必须的，其余的等会加载。
 - 划分主域。将资源划分的请求划分到几个不同的域上，来加速资源请求。

对于我这样的懒人来说，我使用 Google 出品的 [PageSpeed](https://developers.google.com/speed/pagespeed/?hl=zh-CN)。它主要的功能是针对前端页面而进行服务器端的优化，对前端设计人员来说，可以省去优化 css、js 以及图片的过程。它可以对 CSS 和 JavaScript 压缩、合并、级联、内联，生成一个新的 Script 和 CSS 文件 。还有图像优化：剥离元数据、动态调整，重新压缩，如针对 Chrome 浏览器生成 WebP 文件。还可以推迟图像和 JavaScript 加载。

####页面内部优化

HTML 页面内的优化的目的便是：**尽快渲染出页面**。常见的优化策略便是：

 - 将 CSS 放在顶部，即早点渲染出页面及其样式。
 - 将 JavaScript 放在底部。如果有后台渲染机制，那么就应该将 JS 放到页面底部来加速页面加载。如果是单页面应用，那么这个 JS 就应该在页面顶部。
 - 压缩 HTML。在我们写模板的过程中，一些判断可能会导致页面有过多的空格。压缩这些 HTML，可以稍微提高一下页面速度。

这里的大部分内容都应该通过修改代码来完成。

####启用缓存

前面的缓存一节里，我们说过了一些缓存的策略，我们再稍微提一下。

 - 后台优化，如数据库端缓存
 - 启用页面缓存，即应用层缓存

####减少下载量

简单地来说，就是减少对服务器的请求：

 - 使用 CDN
 - 使用外部 JavaScript 和 CSS
 - 缓存：使用 gzip 压缩、添加 Expires 头、配置 ETag、使 AjaX 可缓存

####网络连接上的优化

主要就是对域名到服务器进行优化，因此从方法上有：

 - DNS 域名解析加速
 - 减少 DNS 查找
