`
febird
  • 浏览: 254234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
  前段时间自作聪明的还以为自己发现了一个完美的解决异步IO的方法,还真太把自己当回事了。人家已经早有这个办法了,还有个学名,叫做Coroutine,在异步IO中的应用也已经非常多了,我真是太孤陋寡闻了。
刚才看coroutine,在这个页面   感觉最有意思的是这一段话: (The header file is MIT-licensed, so you can use it in anything you like without restriction. If you do find something the MIT licence doesn't permit you to do, mail me, and I'll probably give you explicit permission to do it anyway.)
在异步通讯中,一般使用一个线程来select/poll/epoll,收到信号后,解码消息头,或者整个消息,然后将相应的fd交给其他线程处理。 这看上去的确是个很好的办法,但是,如果使用Tcp,并且遇到一个复杂的派发过程:收到的消息大小未知,而只能使用序列化方法解码消息然后根据其内容进行派发。这种情况的特征是:在大多数情况下,都可以无阻塞地读取并解码整条消息,但也有极小的可能在某条消息上阻塞(消息不完整)。 这种情况往往使用线程池,select线程一得到可读信号,就把相应的fd交给线程池处理。这样是解决了问题,但是又有个新问题:线程切换的开销太大。如果在高速局域网内,并且每个请求的实际执行时间非常 ...
项目地址:http://code.google.com/p/febird    如前介绍,相当于 std::map<Key1,std::map<Key2,Data> >,但接口也不完全相同,这里只贴代码:   /* vim: set tabstop=4 : */ #ifndef __febird_bdb_kmapdset_h__ #define __febird_bdb_kmapdset_h__ #if  ...
项目地址:http://code.google.com/p/febird   使用前面介绍的序列化框架,可以非常简单地将Bekeley DB作为存储层,实现一个易于使用的,强类型的,持久化的map。   这个设计的的基本原则就是:模板作为一个薄的、类型安全的包装层,实现层的代码可以多个模板实例来公用,这样不但加快了编译时间,也减小了生成的代码尺寸。 这个实现相当于std::map<Key,Data>,但接口上也不完全相同,主要是基于易实现和性能考虑。 下一篇介绍std::map<Key1,std::map<Key2,Data> >的Berkeley ...
最便捷、最强大、速度最快的C++序列化框架。   特别注意:vc6太古老,不符合C++规范,无法使用该框架
项目地址:http://code.google.com/p/febird    如果一个任务的执行分多个步骤,有些步骤慢,有些步骤快,如果在处理时间长的步骤上使用更多线程,那么因为队列的缓冲作用,在平均处理时间上,这些步骤就可以大致持平了,从而导致更大的吞吐量。 以前的 Pipeline 完全胜任这样的需求,但是,如果有一个这样的需求,考虑如下例子: 有若干篇文章(百万以上),需要对这些文章进行分析并索引,使用Pipeline,分成以下步骤: 步骤 平均耗费时间(每篇文章)
地球上曾经出现了一种鹿,叫做爱尔兰巨角鹿,毫无疑问,它有非常巨大的鹿角。按照新达尔文注意的解释:在开始的时候,较大的鹿角使得鹿有较强的生存能力,它夺取了第一个高地。后来事情发生了一点变化,雌鹿开始喜欢 ...
  最近又读了一些进化论。联想到当前,最有潜力和最有影响力的几种计算机语言:C/C++,Java,.Net,D,当然其中.Net不是单一的语言,而是一个多语言的平台。其中D语言大家相对比较陌生。这里我要重点说的是C++和D。
我以前一直对WinApi参数太多,使用困难颇有微词,但是仔细想想,直接使用Api编程的情况是非常少的。Api难用点,功能强点,好过好用但功能弱。 同时,仔细分析下Api的参数,能发现,它其实是很有设计原则的,我只归纳出以下: 尽量使用单层参数,也是说,参数是简单数据类型,没有内嵌结构; 尽量避免使用多层参数,也就是说,不得不使用结构传递参数的时候,结构里面尽量避免再内嵌其它结构。因此可以看到,一个参数很多的Api中,往往有好几个参数共同表达一个逻辑实体,而在面相对象中,这应该用一个对象来表达。 看看这个Api,很生动的一个例子: WINSOCK_API_LINKAGE INT WSAAPI Ge ...
我所了解的泛型实现,也就C++和Java,C++靠的是用代码膨胀来满足性能,Java泛型则只是一个Sugar。 现在使用C++泛型的人越来越多,生成的程序体积也越来越大。一个对10种数据和10种算子使用了泛型算法的程序,代码膨胀的最大可以达到100倍。但实际上,生成的代码“很模板”。现在的C++还没有C++0x 的 closure/auto 等功能,代码膨胀已经达到了很恐怖的程度。——比如使用了 Boost.asio 的程序尺寸就很恐怖。 现在,代码膨胀虽然已经是一个很引起大家注意的问题,但是还没有让大家足够注意。虽然有一些减少代码重复的技巧,但那只是技巧而已,对问题的映射不是很直接,有一定难度 ...
我碰到过这个问题,一开始我把工行的网站加入“可信站点”区域后,可以用了,但是过了一段时间(安装了一些Windows更新后),又不能用了,也还是不能用网上银行,总提示“the "my" store could not be opened ”,到“可信站点”中看,工行的站点仍然在啊!不知道微软哪根筋抽了!不过现阶段,人家再抽筋,我们也必须跟着人家也抽筋,要不就别用网上银行! 这个问题困扰了好久,每次我都是使用管理员权限打开 IE 再重新粘贴网址来付款,有时候这种方法还不能用,比如在其他(非阿里巴巴旗下)网站使用支付宝付款时。 气愤之下,曾经到一个论坛大骂IE,大骂微软那帮傻.逼。 ...
  一个简单例子: 有很多个html网页,网页的id、title、url、path等信息存在一个数据库表中,网页内容存储在一个磁盘阵列上。现在要把所有网页都读出来,统计其中的html标签、正文等信息,并写入另一个数据库表,怎样的设计最好呢? 一般的想法是使用多个平行的线程,每个线程处理某个ID范围的网页。但是仔细分析就可以发现,对每个网页的处理可以分为以下处理步骤: 读取数据库行 读取文件内容 解析html,生成统计数据 将统计结果写入数据库 这几个处理步骤有各自的特征,读取数据库的时间一般主要消耗在数据库服务器响应,读取文件内容一 ...
C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。 曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊! 记得在大学的时候(2000年前后),初学习 template 时,感觉template之间的耦 ...
项目地址:http://code.google.com/p/febird    - 共有 n 个内部结点,n 个外部结点 - winner 只用于初始化时计算败者树,算完后即丢弃 - winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员 - winner 的第 0 个单元未用 - m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者  - 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n)  - 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key,   但是他们的初始化不需要 ...
Global site tag (gtag.js) - Google Analytics