optimized feedman

一个简单的feedman终于成形了,目前只有一个功能,即按照更新时间顺序排列所有的feed,见这里。我居然一共订阅了211个feed,天知道每天在这上面浪费了多少时间。

一度担心这个程序运行时间太长,无法在dreamhost上运行,后来才发现是个笑话,还有大把的CPU时间可以利用,接下来这一年要充分利用一下。不过优化还是做了,效果比较明显,下面是优化后的profile结果:

Total Elapsed Time = 1552.900 Seconds
  User+System Time = 30.78019 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 57.2   17.62 17.627 252416   0.0000 0.0000  XML::Parser::Expat::eq_name
 25.0   7.714 25.340 720851   0.0000 0.0000  XML::Parser::Expat::within_element
 11.4   3.521 31.838 152421   0.0000 0.0002  XML::RSS::handle_char
 4.85   1.492  1.492 195848   0.0000 0.0000  XML::Parser::Expat::namespace
 3.36   1.035  1.903 384149   0.0000 0.0000  XML::Parser::Expat::generate_ns_name
 3.20   0.986  0.986 318115   0.0000 0.0000  XML::Parser::Expat::current_element
 3.08   0.947  1.766   1188   0.0008 0.0015  DateTime::new
 2.82   0.868  0.868 224071   0.0000 0.0000  XML::Parser::Expat::GenerateNSName
 2.79   0.860 34.604    117   0.0074 0.2958  XML::Parser::Expat::ParseString
 1.72   0.528  0.559   4795   0.0001 0.0001  Params::Validate::_validate
 1.55   0.477  1.881  19221   0.0000 0.0001  XML::RSS::handle_start
 1.00   0.308  0.318    649   0.0005 0.0005  URI::_init
 0.57   0.176  0.340   5605   0.0000 0.0001  LWP::Protocol::http::SocketMethods::sysread
 0.53   0.163  0.163   5605   0.0000 0.0000  LWP::Protocol::http::SocketMethods::can_read
 0.53   0.162  0.672    225   0.0007 0.0030  LWP::Protocol::collect

对比上次profile结果可以发现,User+System时间从70秒减少到30秒。既然XML::Parser已经是最快的,优化又是如何做的呢?方法是减少调用次数。首先是检查LWP::UserAgent->mirror的返回代码,判断xml文件是否更新过,如果没有更新,自然也就没有必要解析;另外对于不能使用mirror的网站,虽然每次仍然抓取,但也未必一定要解析,方法是每次抓取下来后使用Digest::SHA生成一个256位的16进制码,并保存起来,如果下一次生成的码没变,那么就可以假设该文件没变,因此也不需要解析xml文件,这样占用时间最多的Perl过程的调用次数减少了一小半。

让我困惑的是怎么总时间差那么多?上次是怎么测试的?难道只测了google reader上的订阅?

在开发这个程序的过程中真是什么问题都碰到了,当然问题最多的还是日期问题。比如排在第一的那位,最近更新时间居然是2008年!还有排在第二的(2007年2月8日)Stevey’s Blog Rants,我在bloglines上好久都没看多有更新,而在我这里居然排第二,仔细检查后发现原来他在feedburner上的feed已经改过了,我用的那个已经无效,而更新时间是从其它feed上得到的。还有,Site News for A.P.Lawrence Unix, Linux and Mac OS X Resources的月份数居然是从0开始,开始的时候没仔细看,心想日期明明就在那里,怎么就解析不出来呢?在调试器里折腾了好几趟,终于发现了这个诡异的问题。再有一个让我吐血几天的是思维驱动,日期就在那里啊,而且格式也对!?原来是不能用mirror,这才使用了前面提到的Digest::SHA。

最后还是要提一句,做优化切莫想当然,一定要基于profile的结果。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据