- 浏览: 181727 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhulin0504:
必须赞
浅谈Java内部类的四个应用场景 -
zhmy0129:
想打印 表起来。
软件工程师的7年总结 -
RonQi:
lionkingzw 写道pop1030123 写道wly71 ...
java调用python -
linchixiong:
有种茅塞顿开的感觉,感谢啊~~
浅谈Java内部类的四个应用场景 -
hnzhoujunmei:
为什么没有完整的源码啊?
用 Java 通过串口发送手机短信
2006年10月份,我开始对web开发产生了兴趣,并决定自己也尝试开发一个网站。在此之前,我做过3年的java application的开发,对web开发应该算一无所知。在比较了java,php,ror,和python后,我选择了基于python的web框架 - django 。到目前为止,我还认为这是一个明智的决定。Django高效的开发效率让我仅仅用一个月的业余时间,就基本完成了网站的开发。这是一个网络书签的网站,我加上了一些有意思的特性,让网站显得有些与众不同。
我购买了域名和Dreamhost 的主机空间。Dreamhost支持django,并且第一年的费用只有180元人民币。2006年11月份,http://www.hpbookmarks.com 上线了。网友们发来了善意的评论,“很有创意”,“点意思”,“一些feature很不错”。同时,还有一个非常一致的意见就是,“访问速度太慢了”。其实,当时的情况不只是访问速度慢,而且是相当不稳定。很多时候是几个小时网站无法访问。当时,我并没有在意,因为我有两个自以为“合理”的解释。第一,我用的是国外最便宜的虚拟主机,国内访问慢是很正常的。第二,django的还处于0.95的状态,效率和稳定性方面有问题也正常。
但是,我慢慢发现上面的解释不过是自己骗自己的借口。很多用dreamhost的网站,访问起来也很快。而且django也已经被成功应用在许多大型的网站。我开始认真考虑提高网站速度的问题了。毕竟,速度慢的网站很可能在第一次就失去的用户,他们可以永远不会再来了。终于,我进行了下面一步一步的优化工作,并且取得了一个看起来还不错的结果。
第一步,用Ajax提高用户体验
由于我的网站上链接字体的大小是根据点击次数决定,所以每次点击都要提交到服务器端并记录次数,再在客户端打开网站链接。这在localhost测试的时候没有发现问题,但是部署到服务器上,会感到明显的等待。解决办法就是用Ajax。用户点击网站链接后就直接打开,再通过Ajax将点击的事件提交到服务器端记录。这样用户感觉不到任何延时。
第二步,将逻辑移到客户端的javascript中
在开始的时候,“网站标签高亮”和“手气不错”的功能都是提交到服务器端操作,然后返回结果的。后来,我发现其实很多逻辑是可以移到客户端,由 javascript来实现的。Javascript非常强大,可以完成很多复杂的逻辑。将逻辑移到客户端的javascript中,可以很有效的减少和服务器通讯的次数,获得更好的访问速度。
第三步,解决进程的
由于采用的是fastCGI的方式,我配置了 django.fcgi。可是,我发现系统进程中,有大量的django.fcgi进程被标记为 < defunct>(失去功能)。这些进程会导致服务器有时无法正常访问。我开始尝试用命令来kill掉这些进程,但是很快发现这无法从根本上解决问题。后来,我看到一个老外在blog上提到一个解决方案,将django.fcgi改名为dispatch.fcgi。原来,dispatch.fcgi 是一个dreamhost的系统进程,它的健壮性是可以得到保障的。果然,我将django.fcgi改名为 dispatch.fcgi后,的现象再没有出现。
第四步,优化SQL语句
SQL语句的执行通常也是一个很花费时间的操作。经过检查,我发现我的一条SQL语句,是一个嵌套三层的子表查询。而这条SQL还必须是一个Raw SQL,即不能采用django的OR Maping。这意味着不能被cache缓存,每次都是真刀真枪的执行。更失败的是,经过我的分析,这条SQL完全可以不执行。这是一次设计上的失误,标
准的over design(过渡设计)。当时,我是想通过数据库得到一个最精确的统计值。后来发现,这个值完全可以用一个近似的常量代替。优化SQL,尤其是避免不必要的SQL执行,带来的效果是非常明显的。
第五步,尽量减少页面大小
随着添加网站越来越多,有一天我发现django生成的首页已经达到了80k。我很清楚这是一个非常不能被接受的数字。我开始检查页面,很快发现了线索。第一,因为偷懒,页面中很多layout是用空格( )实现的。第二,因为为了增加代码可读行,调试方便,每行生成的页面都增加换行符 (\n)。第三,最糟糕的是,大量的用了
inline css。就是将css style直接嵌入标记块中。于是,我立即动手,用css的align解决layout,去掉\n,将inline css抽象到独立的css文件中。这样下来,在不更改任何内容的情况下,80k变成了57k。(补充:由于网站链接大部分是打开新窗口,所以用了大量的 target=_blank。在ylsdd的提示下,在html的head里增加了,又节约了4k。)
第六步,用gzip进行页面压缩
当我兴高采烈的把页面优化结果贴到了smth bbs上,却被直接泼了盆凉水。原来百分之二十几的优化结果,实在太一般了。ylsdd给我了一个很重要的线索,deflate。原来apache的 deflate模块可以把文件进行gzip压缩,压缩后的文件传到浏览器后再被解压。主流的浏览器都支持这种gzip的解压操作。于是,我在apache 的配置文
件中加入了Add OutputFilter DEFAULT html css js的语句。经过测试,css,js这些文本文件的压缩后都只有原来尺寸的25%。这里,和大家分享一个网站 http://www.port80software.com/products/httpzip/compresscheck 它的作用是检测你的网站是否被压缩,以及压缩比率等。
第七步,回归静态页面
新的问题又来了。原来deflate只支持静态文件的压缩。而我的首页是django动态生成的,deflate模块没有进行压缩。我突然想到,网站的首页为什么不能是静态页面呢?于是,我增加了一个runtime的api,这个api提供的是和原来一样由django动态生成的页面。我又写了一个 python的程序,通过urllib2模块下载这个动态生成的页面,并保存为index.html。我将网站的root映射到index.html这个静态页面。最后,通过linux crontab定义一个行为,每五分钟执行一下这个python程序,生成新的index.html。值得一提的是,由于网络原因,python程序不一定每次都能准确完整的下载动态生成的页面。所以我们必须再进行一个校验算法。当页面大小要超过一定数字,页面中出现某个校验字符串的情况下,才保存 index.html。这样,每次用户提交的访问,不是由服务器端动态生成页面,极大的节省了服务器端的开销。而静态页面又可以有效的被deflate压缩。最后结果,首页被压缩为13k,为原来的22%。唯一的区别就是,新提交和推荐的网站不能立即出现在首页。但是我认为,这应该是可以被接受的。
至此,网站的优化工作基本完成。网站的访问速度从原来30秒以上,缩短到3秒左右,应该说算是一个飞跃。虽然,3秒的速度也不是非常快,但是,考虑到虚拟主机等客观原因,这个结果我还是满意的。原来感觉我的网站很慢的朋友们,也可以再试试。
以上的优化方案出自我的个人经验,并不一定适合所有网站。但是,它告诉我们一个事实。影响网站访问速度的不仅仅是服务器配置,网络带宽。也许,你糟糕的设计,低效率的方案也是致命的因素。应当注意的是,优化工作也不能匆匆上手。一定要仔细研究,具体情况具体分析,得到统计数据,找到真正的问题所在,再开始优化。相信自己,提高网站的访问速度并不是不可能。毕竟,Nothing is Impossible。祝大家成功。
来自 http://web.hangyequan.com/bbs/board-3347.html
我购买了域名和Dreamhost 的主机空间。Dreamhost支持django,并且第一年的费用只有180元人民币。2006年11月份,http://www.hpbookmarks.com 上线了。网友们发来了善意的评论,“很有创意”,“点意思”,“一些feature很不错”。同时,还有一个非常一致的意见就是,“访问速度太慢了”。其实,当时的情况不只是访问速度慢,而且是相当不稳定。很多时候是几个小时网站无法访问。当时,我并没有在意,因为我有两个自以为“合理”的解释。第一,我用的是国外最便宜的虚拟主机,国内访问慢是很正常的。第二,django的还处于0.95的状态,效率和稳定性方面有问题也正常。
但是,我慢慢发现上面的解释不过是自己骗自己的借口。很多用dreamhost的网站,访问起来也很快。而且django也已经被成功应用在许多大型的网站。我开始认真考虑提高网站速度的问题了。毕竟,速度慢的网站很可能在第一次就失去的用户,他们可以永远不会再来了。终于,我进行了下面一步一步的优化工作,并且取得了一个看起来还不错的结果。
第一步,用Ajax提高用户体验
由于我的网站上链接字体的大小是根据点击次数决定,所以每次点击都要提交到服务器端并记录次数,再在客户端打开网站链接。这在localhost测试的时候没有发现问题,但是部署到服务器上,会感到明显的等待。解决办法就是用Ajax。用户点击网站链接后就直接打开,再通过Ajax将点击的事件提交到服务器端记录。这样用户感觉不到任何延时。
第二步,将逻辑移到客户端的javascript中
在开始的时候,“网站标签高亮”和“手气不错”的功能都是提交到服务器端操作,然后返回结果的。后来,我发现其实很多逻辑是可以移到客户端,由 javascript来实现的。Javascript非常强大,可以完成很多复杂的逻辑。将逻辑移到客户端的javascript中,可以很有效的减少和服务器通讯的次数,获得更好的访问速度。
第三步,解决进程的
由于采用的是fastCGI的方式,我配置了 django.fcgi。可是,我发现系统进程中,有大量的django.fcgi进程被标记为 < defunct>(失去功能)。这些进程会导致服务器有时无法正常访问。我开始尝试用命令来kill掉这些进程,但是很快发现这无法从根本上解决问题。后来,我看到一个老外在blog上提到一个解决方案,将django.fcgi改名为dispatch.fcgi。原来,dispatch.fcgi 是一个dreamhost的系统进程,它的健壮性是可以得到保障的。果然,我将django.fcgi改名为 dispatch.fcgi后,的现象再没有出现。
第四步,优化SQL语句
SQL语句的执行通常也是一个很花费时间的操作。经过检查,我发现我的一条SQL语句,是一个嵌套三层的子表查询。而这条SQL还必须是一个Raw SQL,即不能采用django的OR Maping。这意味着不能被cache缓存,每次都是真刀真枪的执行。更失败的是,经过我的分析,这条SQL完全可以不执行。这是一次设计上的失误,标
准的over design(过渡设计)。当时,我是想通过数据库得到一个最精确的统计值。后来发现,这个值完全可以用一个近似的常量代替。优化SQL,尤其是避免不必要的SQL执行,带来的效果是非常明显的。
第五步,尽量减少页面大小
随着添加网站越来越多,有一天我发现django生成的首页已经达到了80k。我很清楚这是一个非常不能被接受的数字。我开始检查页面,很快发现了线索。第一,因为偷懒,页面中很多layout是用空格( )实现的。第二,因为为了增加代码可读行,调试方便,每行生成的页面都增加换行符 (\n)。第三,最糟糕的是,大量的用了
inline css。就是将css style直接嵌入标记块中。于是,我立即动手,用css的align解决layout,去掉\n,将inline css抽象到独立的css文件中。这样下来,在不更改任何内容的情况下,80k变成了57k。(补充:由于网站链接大部分是打开新窗口,所以用了大量的 target=_blank。在ylsdd的提示下,在html的head里增加了,又节约了4k。)
第六步,用gzip进行页面压缩
当我兴高采烈的把页面优化结果贴到了smth bbs上,却被直接泼了盆凉水。原来百分之二十几的优化结果,实在太一般了。ylsdd给我了一个很重要的线索,deflate。原来apache的 deflate模块可以把文件进行gzip压缩,压缩后的文件传到浏览器后再被解压。主流的浏览器都支持这种gzip的解压操作。于是,我在apache 的配置文
件中加入了Add OutputFilter DEFAULT html css js的语句。经过测试,css,js这些文本文件的压缩后都只有原来尺寸的25%。这里,和大家分享一个网站 http://www.port80software.com/products/httpzip/compresscheck 它的作用是检测你的网站是否被压缩,以及压缩比率等。
第七步,回归静态页面
新的问题又来了。原来deflate只支持静态文件的压缩。而我的首页是django动态生成的,deflate模块没有进行压缩。我突然想到,网站的首页为什么不能是静态页面呢?于是,我增加了一个runtime的api,这个api提供的是和原来一样由django动态生成的页面。我又写了一个 python的程序,通过urllib2模块下载这个动态生成的页面,并保存为index.html。我将网站的root映射到index.html这个静态页面。最后,通过linux crontab定义一个行为,每五分钟执行一下这个python程序,生成新的index.html。值得一提的是,由于网络原因,python程序不一定每次都能准确完整的下载动态生成的页面。所以我们必须再进行一个校验算法。当页面大小要超过一定数字,页面中出现某个校验字符串的情况下,才保存 index.html。这样,每次用户提交的访问,不是由服务器端动态生成页面,极大的节省了服务器端的开销。而静态页面又可以有效的被deflate压缩。最后结果,首页被压缩为13k,为原来的22%。唯一的区别就是,新提交和推荐的网站不能立即出现在首页。但是我认为,这应该是可以被接受的。
至此,网站的优化工作基本完成。网站的访问速度从原来30秒以上,缩短到3秒左右,应该说算是一个飞跃。虽然,3秒的速度也不是非常快,但是,考虑到虚拟主机等客观原因,这个结果我还是满意的。原来感觉我的网站很慢的朋友们,也可以再试试。
以上的优化方案出自我的个人经验,并不一定适合所有网站。但是,它告诉我们一个事实。影响网站访问速度的不仅仅是服务器配置,网络带宽。也许,你糟糕的设计,低效率的方案也是致命的因素。应当注意的是,优化工作也不能匆匆上手。一定要仔细研究,具体情况具体分析,得到统计数据,找到真正的问题所在,再开始优化。相信自己,提高网站的访问速度并不是不可能。毕竟,Nothing is Impossible。祝大家成功。
来自 http://web.hangyequan.com/bbs/board-3347.html
发表评论
-
转:关于IT人士个人发展的一点思索
2010-02-27 15:48 1085以下是侯捷先生的作品and译品。 《深入浅出MFC》 《E ... -
关于域名,虚拟主机,VPS和独立主机等网站托管
2010-02-27 15:40 14431.域名。根据现在国内 ... -
编程习惯
2010-02-09 10:28 905编程习惯 文/Alexey Radul 译/程显峰 近年 ... -
主流互联网开发平台一览
2010-01-16 14:54 1243Google(Orkut) 工具型、数 ... -
不要成为紧急的奴隶
2010-01-16 12:54 874李开复言: ... -
2009十大网络流行语 中英文对照读本
2010-01-08 12:25 810---------- ... -
好 vs 不好
2010-01-07 09:58 743要判断一个程序员是不 ... -
18
2009-12-09 20:34 702古代武林江湖有18般兵器,如果有人这18般兵器样样精通,那一定 ... -
这个..
2009-12-09 20:25 6751,永远不要向任何人解释你自己 因为喜欢你的人不需要 ... -
最愚蠢行为
2009-12-09 19:53 697谁也不能保证自己就是聪明人不会犯糊涂,就连诸葛亮都有做错决定的 ... -
梁某某
2009-12-01 20:36 729郁闷就是生产力(我们每天有那么多事要做,工作、生活、旅游、恋爱 ... -
命运掌握在自己手中
2009-11-29 20:43 734李彦宏独家撰文:命运掌握在自己手中http://www.sin ... -
十五条让你活的更好
2009-11-29 20:22 8121、说话要用脑子,做事慎言,话多无益,嘴只是一件扬声器而已,平 ... -
十个习惯让你精通新的开发技术
2009-11-23 19:49 600这篇文章,是从我的《高效开发人员的五个特征》一文中抽出的一个观 ... -
12级跳
2009-11-23 19:47 658第1跳:1个目标 一艘没有航行目标的船,任何方向的风都是逆 ... -
让创业者惊讶的19个真相
2009-11-22 19:21 772Y Combinator的Paul Graham最 ... -
JetSpeed
2009-11-20 11:01 1420JetSpeed是ASF旗下的一款开源软件,面向portals ... -
基础平台
2009-11-20 10:49 682作者:anders 2009年5月5日 ... -
record2
2009-11-18 19:11 614程序员每天该做的事 1 ... -
《The Elements of Programming Style》
2009-11-17 19:25 968《The Elements of Programming St ...
相关推荐
(3)计数器为三十秒递减计时,计时间隔为时间单位一秒。 当电路工作时,由555定时器组成多谐振荡器,选取适当的电容使震荡周期为1s。 (4)计时器递减计时到0的时候且灭灯后,有指示灯亮起表示报警信号的发生。 ...
30秒八位抢答器 51单片机 1.数字抢答器设计 设计任务与要求(基本功能) (1)抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S0 ~ S3表示; (2)设置一个系统清除和抢答控制开关S,该开关由主持人控制; (3)...
这是一个用multisim仿真的三十秒计数器,可以实现从三十开始倒数到一,用了两块7448N芯片和两块74192N芯片等。
1、设计一个30秒计时电路,并具有时间显示的功能。 2、设置外部操作开关,控制计时器的直接清零,启动和暂停/连续计时。 3、要求计时电路递减计时,每隔一秒钟,计时器减一。 4、当计时器递减计时到零(即定时时间到...
30秒计时器的设计和制作有很多方法,本文介绍的30秒计时器以AT89C51单片机作为控制单元,采用数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。计时器初始状态显示“00”,当裁判员按下计时键,...
本课程设计是脉冲数字电路的简单应用,设计了篮球竞赛30秒计时器。此计时器功能齐全,可以直接清零、启动、暂停和连续以及具有光电报警功能,同时应用了七段数码管来显示时间。此计时器有了启动、暂停和连续功能,...
今天给大家带来一些30秒就能学会的代码片段,这些代码潜力无限,蕴含了丰富的python编程思维,应用领域非常广泛,而且学起来非常简单。 1.“二维列表” 解读:根据给定的长和宽,以及初始值,返回一个二维列表。 ...
在vue.js项目中,经常需要对数据实时更新——每隔xx秒需要刷新一次接口——即需要用到定时器相关原理。这篇文章主要介绍了vue项目每30秒刷新1次接口的实现方法,需要的朋友可以参考下
1、在数码管的第一、二个显示从01秒到15秒的循环正计时秒表,第三、六个数码管显示“-”号,第四、五个数码管显示当前环境温度,第七、八个数码管显示电机转速; 2、直流电机转速随秒表时间变化;当秒表时间在01秒到...
到20s时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2S。到2S时,东西黄灯熄,东西红灯亮。同时,南北红灯熄灭,南北绿灯亮。东西红灯亮维持30S。南北绿灯亮维持25s。然后闪烁3s,熄灭。...
4. 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动"开始"键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。 5. 参赛选手在设定的时间内进行抢答,抢答...
2、 当两个方向的车流量差较大时,流量大的方向红灯亮20秒,绿灯亮30秒,黄灯亮5秒,流量小的方向红灯亮35秒,绿灯亮15秒,黄灯亮5秒。 3、 用两个由电位器控制的范围为1到4伏之间的直流电压信号V1,V2模拟两个方向...
(3)播放音乐mp3功能,也可以直接拖动音乐文件到,倒计时牌上,音乐同样会被播放(从桌面上拖放的音乐不能正常播放音乐) (4)倒计时误差一般在1~2秒之内 mp3拖放说明: 停止:如图第三格位置双击鼠标 暂停:如上图...
2018-01-30 V80 + 新的滚动通知+紧急通知(系统版本在V1.0_0162及以上) + 按遥控器(左上上下右,可修改)可进入应用配置和系统配置 * 修复系统版本过低时时间显示不准确的问题 + 支持在线设备统计(系统...
3. 倘若主持人按下开始的30秒内有人抢答,则倒计时从10秒开始,同时在一屏幕上显示该抢答选手号码,若10秒内无法回答,则该选手视为题目回答错误,选手号码清零。 4. 实验装置有红.绿.黄三盏灯;其中绿灯在主持人...
2.解压出来然后上传文件到网站的根目录下 3.将文件内32行的域名更改为本人网站的域名 4.设置定时访问任务 http://你的域名/60s.php(能够经过宝塔之间停止创立) 宝塔创立定时任务办法 找到宝塔的方案任务 任务类型...
示例代码: %从以下位置下载涵盖怀俄明州西北部的USGS 1/3弧秒数据%42.5至45纬度和-111.05至-108.6经度region = fetchregion([42.5,45],[-111.05,-108.6],'display',true); %读取黄石国家公园的海拔数据...
3.计时器为30秒递减计时,其计时间隔为1秒。 4.当计时器递减计时到零时,数码显示器不能灭灯,应发出光电报警信号。 三、设计方案 本实验的核心部分是要设计一个30s计数器,并且对计数结果进行实时显示,同时要...
本文给大家分享的是个人项目中使用的javascript实现的精确到秒级的倒计时代码,十分的实用,有需要的小伙伴可以参考下。
3. 数字抢答器定时为30秒,启动起始键后,要求:①30秒定时器开始工作;②扬声器要短暂报警;③发光二极管亮灯。 4. 抢答者在30秒内抢答,抢答有效,终止定时;30秒定时到,无抢答者本次抢答无效,系统短暂报警,...