IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Web性能优化中的CPP方法

搜索技术博客-淘宝 2010-12-26 21:09:57 累计浏览 3,444 次
本机暂存

    毋庸置疑,Web性能优化是最近几年非常热门的话题。从Yahoo!在2006年推出YSlow以及相应的14的军规,到今年领军人物Steve Souder提出WPO的概念。几年时间里,网站性能重要性的概念已经深入人心,除一线的工程师,包括产品经理以及管理层纷纷加入其中,推进页面性能优化。大家普遍认为:性能好的网站,能吸引更多的用户,提供更好的用户体验,增加收入,并且降低成本。

    那么如何才能做好性能优化工作?Steve的两本书:《High Performance Web Sites》(中文版:《高性能网站建设指南》)和《Even Faster Web Sites》(中文版:《高性能网站建设进阶指南》),讲述了Web性能方面的最佳实践以及后面的研究和现实效果,可以说这个领域的葵花宝典。淘宝搜索结果页践行其中的最佳实践,不断总结优化,取得了明显的成果。基于这些实际的工作,我们总结出来性能优化简单有效的CPP方法和大家分享。

    原图已失效

  

Cache

    Cache是任何大规模系统必须考虑的一个问题,其基本依据是从Cache中获取数据性能上要远优于重新计算。基本模式是Miss -> Store -> Hit。如下图所示:

    原图已失效

    基本步骤:

首先检查Cache中是否有对应的数据;如果没有,请求后端,获取数据后将数据缓存起来;返回结果;如果命中,直接从cache 中返回数据。

    通常情况下,使用Cache能够大幅提升系统的性能,降低后台数据库的压力。淘宝目前很多系统都在使用Memcached和Tair.更多内容可参见对应的官方网站:

Memcached: http://memcached.org/Tair: http://code.taobao.org/project/view/2/

    需要特别指出的,Cache不是万能钥匙,并非适用所有的场景。使用时具体分析业务需求,关注Cache大小和命中率等指标。

Parallelism

    为了更好的用户体验,一个页面要尽可能地展示更多的相关信息,这种趋势被称为“Mashup”。以淘宝搜索结果页为例,页面中要展示宝贝搜索结果、相关搜索、产品搜索等多个模块的数据。如果按照传统串行化的做法,依次请求每一个后台模块,必然将大幅增也页面延迟。如果能够同时请求这些后台接口,做到并发访问,将大幅提升页面的性能。

    并发的方法有很多。玄悲同学在这篇文章给出了使用Multi CURL实现并发的方法,供大家参考。此外,Facebook在今年推出了革命性的BigPipe技术,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳,也有很大的借鉴意义。

Prediction

    性能优化关乎用户体验,其中很重要的一个工作就是度量(Measuring),究竟页面要多块才能满足用户的需求?如果有时候受客观条件限制,不可能做到与生俱来的快,有什么办法来优化?这个问题有点像排兵布阵,很多情况下,我们需要浏览器的特性,做到分段输出。让用户尽可能早地看到页面的内容,降低用户首次交互所需要的等待时间(TTL,Time to Interaction)。

    以淘宝的搜索结果页为例,我们收到用户的查询请求后,简单校验判断后,就开始向浏览器发送页头等信息,降低The First Byte Time。在客户端下载页头HTML和JS、CSS的同时进行后端的计算,完成后将页面输出给用户。这种做法能够一定程度上减少用户等待时间,改善用户体验。在慢速网络的条件下,用户也能够很快地看到搜索结果页的页头和搜索框,以及部分结果。而不是面对一张空白页面等待结果。

    以上就是我们对于性能优化的一些总结。欢迎对此感兴趣的同学交流探讨。

同分类推荐文章

  1. translateZ() (2026-06-25 21:18:56)
  2. translateY() (2026-06-25 21:17:56)
  3. translateX() (2026-06-25 21:16:01)

查看更多 前端 文章 →

建议继续学习

  1. YSLOW法则中,为什么yahoo推荐用GET代替POST? (累计阅读 11,839)
  2. 如何学好C++语言 (累计阅读 10,449)
  3. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,413)
  4. colortail,让 tail 命令绚丽起来 (累计阅读 10,260)
  5. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,500)
  6. 几个内存相关面试题(c/c++) (累计阅读 9,447)
  7. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,876)
  8. 浅析C++多线程内存模型 (累计阅读 8,803)
  9. C++ 多线程编程总结 (累计阅读 8,098)
  10. 使用gdb调试运行时的程序小技巧 (累计阅读 7,209)