2008年04月
有很多个html网页,网页的id、title、url、path等信息存在一个数据库表中,网页内容存储在一个磁盘阵列上。现在要把所有网页都读出来,统计其中的html标签、正文等信息,并写入另一个数据库表,怎样的设计最好呢?一般的想法是使用多个平行的线程,每个线程处理某个ID范围的网页。但是仔细分析就可以发现,对每个网页的处理可以分为以下处理步骤:读取数据库行读取文件内容解析html,生成统计数据将统计结果写入数据库这几个处理步骤有各自的特征,读取数据库的时间一般主要消耗在数据库服务器响应,读取文件内容一般主要消耗在磁盘IO上,解析、统计消耗在计算上,写统计结果也消耗在数据库服务器响应上。如果我们为这几个过程建立各自的线程,每个任务通过消息队列来传递。阅读全文>
发表于 @ 2008年04月22日 16:49:00|评论(loading...)|编辑|收藏
C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊!阅读全文>
发表于 @ 2008年04月22日 16:12:00|评论(loading...)|编辑|收藏
- 共有 n 个内部结点,n 个外部结点 - winner 只用于初始化时计算败者树,算完后即丢弃 - winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员 - winner 的第 0 个单元未用 - m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者 - 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n) - 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key, 但是他们的初始化不需要额外的 winner 数组 - 并且,这个实现比 严蔚敏&吴伟民 的 LoserTree 初始化更强壮 阅读全文>
发表于 @ 2008年04月22日 15:14:00|评论(loading...)|编辑|收藏
一个宏定义生成一个比较器(Comparator),兼键提取(KeyExtractor)类阅读全文>
发表于 @ 2008年04月22日 15:02:00|评论(loading...)|编辑|收藏
用C++写程序经常需要写一些很小的functor,最常见的例子就是 compare functor,排序的,查找的,自己每定义一个数据结构,就要定义一个 compare functor,甚至多个(对不同字段)。甚至,针对指针的,智能指针的……的compare,这件工作很繁琐,很容易使人厌倦。举个例子,同一个数据结构有M个字段,这些字段有P种类型,还有有N种不同的访问方式(直接提取、通过指针、通过智能指针、甚至通过反序列化等等),要实现所有这些情况的查找/排序,就需要 M×N 个 compare functor 的定义!从 boost::multi_index 中学到一点,将 KeyExtractor 和 Comparator 分离,这样,只需要写 P 个Comparator,M+N个KeyExtractor,一般情况下,甚至不需要写Comparator,因为字段类型大多是内建类型,Comparator是默认的。阅读全文>
发表于 @ 2008年04月22日 14:54:00|评论(loading...)|编辑|收藏
原以为足够现代的编译器的优化能力很强,看来我是高估了。GCC 没测过,VC 2008 刚刚被证实了。
阅读全文>
发表于 @ 2008年04月22日 13:53:00|评论(loading...)|编辑|收藏