2008年05月09日
<p>我所了解的泛型实现,也就C++和Java,C++靠的是用代码膨胀来满足性能,Java泛型则只是一个Sugar。</p><p>现在使用C++泛型的人越来越多,生成的程序体积也越来越大。一个对10种数据和10种算子使用了泛型算法的程序,代码膨胀的最大可以达到100倍。但实际上,生成的代码“很模板”。现在的C++还没有C++0x 的 closure/auto 等功能,代码膨胀已经达到了很恐怖的程度。——比如使用了 Boost.asio 的程序尺寸就很恐怖。现在,代码膨胀虽然已经是一个很引起大家注意的问题,但是还没有让大家足够注意。可以预见,等到C++0x出世,泛型的语法更加优美,使用更加方便,大家的积极性更高,到那时,代码膨胀可能会成为一个非常残酷的现实问题。</p><p>应该有一些途径减少代码膨胀,现代的虚拟机(例如Java虚拟机和.Net虚拟机)可以通过动态优化来提高程序性能,先在运行时解释执行ByteCode,当发现某段ByteCode的执行阅读全文>
发表于 @ 2008年05月09日 17:06:00|评论(loading...)|编辑
2008年05月03日
我碰到过这个问题,当我把工行的网站加入“可信站点”区域后,也还是不能用网上银行,总提示“the "my" store could not be opened ”,这个问题困扰了好久,每次我都是使用管理员权限打开 IE 再重新粘贴网址来付款,有时候这种方法还不能用,比如在其他(非阿里巴巴旗下)网站使用支付宝付款时。气愤之下,曾经到一个论坛大骂IE,大骂微软那帮傻逼。但是骂也没用啊,那帮傻逼也不会给你来解决这个问题。刚才一狠心,使用注册表监视器,终于发现了问题!也找到了解决方案,其实很简单:删掉:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains再重新在 IE 安全设置中加入你的站点。——直接在安全设置中删掉再重新加入是不行的,微软的那帮傻逼不知道那根筋抽风了!到此结束一切痛苦!阅读全文>
发表于 @ 2008年05月03日 00:49:00|评论(loading...)|编辑
2008年04月22日
有很多个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...)|编辑
2008年02月23日
经常坐着的同行请注意了,千万不能一下子坐得太久,我这病跟老坐着关系很大。
这病叫做“肛周脓肿”,屁股上,很深的地方,出了脓肿,脓没地方排放,于是就肿大,刚开始很疼,我还以为是那次屁股撞了墙把股骨头撞坏了……,总之,费了很大周折,去医院做了手术,住了20多天的院。
肛门边上被开了一个口子,很疼,很麻烦,……
据医院的保守劝告,3~6个月不可久坐、久行、久立,不可骑自行车……
阅读全文>
发表于 @ 2008年02月23日 15:27:00|评论(loading...)|编辑
2008年01月12日
有一个应用,需要经常做类似这样的查询 select * from SomeTable where key in (KeySet) ,其中 KeySet 可能很大,比如包含几百甚至几千个元素。理想中的情况,数据库应该先在 BTree 中查找到 KeySet 中的 Key 所在的物理页面地址,然后再对这物理地址排序,最后按顺序读入这些页面内容并填充结果。阅读全文>
发表于 @ 2008年01月12日 22:21:00|评论(loading...)|编辑
2007年08月19日
qq 目录下有几个微软的动态库(见图):
如果删掉,按照常规,会加载系统最新的库,但是,当我把这几个文件中的任意一个删除的时候,qq 都无法正常运行。
阅读全文>
发表于 @ 2007年08月19日 16:23:00|评论(loading...)|编辑
2007年02月25日
前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱——我为了减少内存用量并且减少一次内存拷贝,直接通过string.data()修改了string的内部表示。这与其说是一个陷阱,不如说是我自己给自己造了一个陷阱然后把自己给掉进去了。阅读全文>
发表于 @ 2007年02月25日 14:49:00|评论(loading...)|编辑
2007年02月09日
包含多个固定索引,一个可变索引,
固定索引使用一个内存池和一个数组保存项目在内存中的偏移,并且使用前缀压缩,使用空间最小(每个词条4个字节的索引空间)
可变索引不压缩,并且可以动态插入词条,占用空间较大(每个词条20个字节的索引空间)
存储 1000 万个词,占用内存 100M 左右,平均每个词10个字节(包括了字符串空间和索引空间)。
阅读全文>
发表于 @ 2007年02月09日 22:34:00|评论(loading...)|编辑