2008年4月22日

多线程的 pipeline 设计模式

摘要: 一个简单例子:有很多个html网页,网页的id、title、url、path等信息存在一个数据库表中,网页内容存储在一个磁盘阵列上。现在要把所有网页都读出来,统计其中的html标签、正文等信息,并写入另一个数据库表,怎样的设计最好呢?一般的想法是使用多个平行的线程,每个线程处理某个ID范围的网页。但是仔细分析就可以发现,对每个网页的处理可以分为以下处理步骤:读取数据库行 读取文件内容 解析html,生成统计数据 将统计结果写入数据库 这几个处理步骤有各自的特征,读取数据库的时间一般主要消耗在数据库服务器响应,读取文件内容一般主要消耗在磁盘IO上,解析、统计消耗在计算上,写统计结果也消耗在数据库 阅读全文

posted @ 2008-04-22 16:49 能发波 阅读(346) 评论(0) 推荐(0)

C++ 的缺点

摘要: C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊!记得在大学的时候(2000年前后),初学习 template 时,感觉template之间的耦合 阅读全文

posted @ 2008-04-22 16:12 能发波 阅读(303) 评论(0) 推荐(0)

通用的 LoserTree

摘要: - 共有 n 个内部结点,n 个外部结点- winner 只用于初始化时计算败者树,算完后即丢弃- winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员- winner 的第 0 个单元未用- m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者- 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n)- 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key, 但是他们的初始化不需要额外的 winner 数组- 并且,这个实现比 严蔚敏&吴伟民 的 LoserTree 初始化更强 阅读全文

posted @ 2008-04-22 15:14 能发波 阅读(156) 评论(0) 推荐(0)

一个很强大的Comparator生成器

摘要: /** @brief 生成一个比较器(Comparator),兼键提取(KeyExtractor)类 使用这个宏生成的比较器可以作用在不同的对象上,只要这些对象有相同名称的成员, 并且可以作用在类型为成员类型的对象上。 - 假设: - 有 n 个类 class[1], class[2], ... class[n],都有类型为 MemberType ,名称为 MemberName 的数据成员 - 那么以下类型的对象可以使用该类相互比较,并且可以从这些对象中提取出 MemberType 类型的键: class[1] ... class[n], MemberType... 阅读全文

posted @ 2008-04-22 15:02 能发波 阅读(168) 评论(0) 推荐(0)

Comparator 将 M×N 转化成 M+N

摘要: 用C++写程序经常需要写一些很小的functor,最常见的例子就是 compare functor,排序的,查找的,自己每定义一个数据结构,就要定义一个 compare functor,甚至多个(对不同字段)。甚至,针对指针的,智能指针的……的compare,这件工作很繁琐,很容易使人厌倦。举个例子,同一个数据结构有M个字段,这些字段有P种类型,还有有N种不同的访问方式(直接提取、通过指针、通过智能指针、甚至通过反序列化等等),要实现所有这些情况的查找/排序,就需要 M×N 个 compare functor 的定义!从 boost::multi_index 中学到一点,将 KeyE 阅读全文

posted @ 2008-04-22 14:54 能发波 阅读(176) 评论(0) 推荐(0)

C++ 中 Bool functor 的优化

摘要: 原以为足够现代的编译器的优化能力很强,看来我是高估了。GCC 没测过,VC 2008 刚刚被证实了。 pair x(rand(), rand()), y(rand(), rand()); for (int i = 0; i inlinebool operator& _Left,const pair& _Right){ // test if _Left < _Right for pairs return (_Left.first < _Right.first || !(_Right.first < _Left.first) && _Left.se 阅读全文

posted @ 2008-04-22 13:53 能发波 阅读(104) 评论(0) 推荐(0)

导航