前几天突然发现Firefox启动时候CPU占用有50%,更要命的是居然启动不起来,总是崩溃,崩溃,由于开发任务忙,换成别的浏览器继续搞,这两天又去旅游了一趟,早上一到公司,就开始整,DBA Notes的Fenng大侠,在他的博客中说是quick time这个播放器引起的,我跑到安装目录下面,没找到quick time这个插件,最后google到这篇文章,说是由google desktop不兼容引起的,google的桌面软件一向兼容性不是很好,卸载之,果然firefox正常了,唉,惊叹一下google的工程师是不是都用Mac的,郁闷
记忆(memoization)在JavaScript中的应用
函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称之为记忆,英文叫做memoization。关于memoization可以参见维基百科的解释。JavaScript的对象和数组要实现这样的优化是非常方便的,比如说,我们要递归计算著名的fibonacci数列,一个fibonacci数字是之前两个fibonacci数字之和,最前面两个数字是0和1.
var fibonacci = function (n) { return n <2 ? :fibonacci(n-1) + fibonacci(n - 2); }; for(var i = 0; i <= 10; i++) { document.writeln('//' + i + ":" + fibonacci(i)); }
这样的算法是可以工作的,但本身做了很多无谓的运算。fibonacci函数被调用了453次。我们调用了11次,而自身调用了442次去计算可能已经计算过的值。如果我们让该函数具备记忆功能就可以显著减少运算量。
我们在一个名为memo的数组中保存我们的存储结果,存储结果可以隐藏在闭包中。当我们的函数被调用时,这个函数首先看是否已经知道存储结果,如果已经知道,就立即返回这个存储结果。
var fibonacci = function () { var memo = [0,1]; var fib = function (n) { var result = memo[n]; if(typeof result !== 'number') { result = fib(n - 1) + fib(n - 2); memo[n] = result; }; return result; }; return fib; }();
这个函数返回同样的结果,但只被调用了29次,我们调用了它11次。他自身调用了18次去取得之前的存储结果。运算效率大约提升了93%,可见记忆这种优化的能力是非常强大的。PHP语言中也可以使用闭包创造类似的记忆优化算法。
解决file_get_contents的超时问题
file_get_contents一步就做完了打开,读取,关闭的三个动作,过程相当自动化,并且可以读取远程内容,非常方便,在网络状况差的情况下,可能会导致程序执行陷入停滞或者过慢,因为不停的重试和等待PHP进程本身的超时才会退出。晚上再次阅读了PHP手册,发现可以用一个比较变态的东西来解决,就是创建一个可以控制的资源句柄,通过控制资源句柄超时来控制file_get_contents这个方法的超时时间,使用起来很方便,也很简单。
$opts = array( 'http'=array( 'method'="GET", 'timeout'=1, //设置超时,单位是秒,可以试0.1之类的float类型数字 ) ); $context = stream_context_create($opts); $contents = file_get_contents($url,false,$context);
得到内容之后该怎么处理就怎么处理了,关于tream_context_create这个方法的更多HTTP协议参数,请参见:HTTP context options,其他协议,请参见Context options and parameters
Update 09-09-17: 我测试的时候使用的g.cn的首页,非常快,把timeout设置为1,没有超时的感觉,我以为是分钟为单位,感谢的Lightning$指正,单位是秒。
迅雷去广告方法
迅雷应该算是当前中国装机量最大的下载软件,很多人没听过快车,很少人没听过迅雷,不过迅雷在一开始就过度的关注商业利润,使得现在广告满天飞,严重影响用户体验,致使很多人使用修改版(去广告版)迅雷,修改版迅雷之所以受欢迎,不仅仅因为广告,还因为CPU消耗更多,更关注用户的隐私,更方便。这个很类似当年的珊瑚虫QQ,我觉得迅雷有必要去学学QQ了,QQ自从2009版本发布以后,允许用户自定义界面模块,并且边界可隐藏,广告体验大大的优化了,我看过大部分人都不隐藏界面上的东西,有些是因为他们不知道,有些是因为习惯了这样的界面,但无论如何,更好的UI体验,更自由的定制,都堵住了像我这样挑剔的用户的嘴巴,或者用说就是不给钱却要求很多的高端用户,迅雷做的还远远不够,弹出的广告太恶心。
其实修改版迅雷除了精简了一些模块和调整了一些默认设置之外,还做了一件最重要的事情就是修改hosts文件,关于这个文件的作用可以参考百度百科中的解释,这文件的位置位于:C:\WINDOWS\system32\drivers\etc,当然假如你的系统不是在C盘,那就看着办吧,在上面的路径中找到hosts文件,然后右键打开方式里面选择记事本,在文件的最后添上如下字段:
0.0.0.0 pubstat.sandai.net
0.0.0.0 mcfg.sandai.net
0.0.0.0 biz5.sandai.net
0.0.0.0 float.sandai.net
0.0.0.0 cl.kankan.xunlei.com
0.0.0.0 mtips.xunlei.com
0.0.0.0 211.94.190.80
0.0.0.0 adsresult.joywell.com.cn
0.0.0.0 advstat.xunlei.com
0.0.0.0 wy.xunlei.com
0.0.0.0 kkpgv.xunlei.com
0.0.0.0 statis.kankan.xunlei.com
0.0.0.0 server1.adpolestar.net
0.0.0.0 mpv.sandai.net
目前可以达到去除所有广告的目的,不知道以后会不会改地址,暂且用之。另外,修改版迅雷可能会被插入一些用户行为统计的代码或程序,比如尼尔森,艾瑞所思之流就经常和流氓软件的作者合作干这种勾当,这也是我不使用修改版的一个重要原因之一。