Web 项目性能优化

前言

Web性能优化分为后端和前端两个方面。

前端

1、压缩源码和图片
JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可以使用一些开源压缩软件来压缩,比如24色变成8色、去掉一些PNG格式信息等。

2、选择合适的图片格式
如果图片颜色数较多就使用JPG格式,如果图片颜色数较少就使用PNG格式,如果能够通过服务器端判断浏览器支持WebP,那么就使用WebP格式和SVG格式。

3、合并静态资源
包括CSS、JavaScript和小图片,减少HTTP请求。有很大一部分用户访问会因为这一条而取得最大受益

4、开启服务器端的Gzip压缩
这对文本资源非常有效,对图片资源则没那么大的压缩比率。

5、使用CDN
或者一些公开库使用第三方提供的静态资源地址(比如jQuery、normalize.css)。一方面增加并发下载量,另一方面能够和其他网站共享缓存。

6、延长静态资源缓存时间
这样,频繁访问网站的访客就能够更快地访问。不过,这里要通过修改文件名的方式,确保在资源更新的时候,用户会拉取到最新的内容。

7、把CSS放在页面头部,把JavaScript放在页面底部
这样就不会阻塞页面渲染,让页面出现长时间的空白。

如何提高网页的效率(上篇)
如何提高网页的效率(下篇)

后端

二叉搜索树

二叉搜索树/二叉排序树(Binary Search Tree):

二叉搜索树

  1. 根的左子树不空,则左子树上所有结点的值均小于它的根结点的值。
  2. 根的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
  3. 根的左、右子树也分别为二叉搜索树。
Read more

线段树

线段树/区间树(Segment tree)是一种二叉搜索树:

线段树

特点:

  • 每个结点表示的是一个线段,或者说是一个区间。
  • 当父节点的区间为$[x, y]$时,左孩子的区间就为$[x, \frac{ (x + y) }{ 2 }]$,右孩子的区间就为$[\frac{ (x + y) }{ 2 } + 1, y]$。
  • 对于每一棵线段树上的节点,都有三个值:左区间、右区间以及权值。
    (在某些情况下只有左右区间,这个时候线段树只是作为维护某个值而使用的数据结构,如扫描线)

线段树主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为 O(logN)。而未优化的空间复杂度为 2N,因此有时需要离散化来压缩空间。

Read more

字典树

字典树/前缀树/单词查找树/键树(Trie):

字典树

上图表示了关键字集合 {“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。

基本性质:

  1. 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
  2. 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符互不相同。
  4. 从第一字符开始有连续重复的字符只占用一个节点,比如上面的to,和ten,中重复的单词t只占用了一个节点。

应用:

  1. 前缀匹配
  2. 字符串检索
  3. 词频统计
  4. 字符串排序
Read more

Bash游戏

Bash游戏

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1066

有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。
假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。

例如N = 3,K = 2。无论A如何拿,B都可以拿到最后1颗石子。

Read more

构造回文

https://www.nowcoder.com/test/question/28c1dc06bc9b4afd957b01acdf046e69?pid=1725829&tid=14425231

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。

Read more