c++/c++11
oldworm
这个作者很懒,什么都没留下…
展开
-
单线程内存池
1、单线程内存池 内存池的基本思想是大块向系统申请内存,内部切割为小块,内部cache之后有选择的分配,不够的时候继续向系统大块申请内存,示例代码如下: struct tm_memblock{ tm_memblock *next;};class tm_pool{… tm_bufunit *next; //p原创 2010-02-04 16:53:00 · 4041 阅读 · 0 评论 -
我的网络模块设计第二版
07年我写了一篇文章叫《我的iocp模块》,姑且叫那个为第一版吧,由于持续对网络模块进行改进,所以现在的实现和当时有很大改变,加上上层应用越来越多,又经过了几年时间考验,现在的实现方式比之前的更灵活更有效率,也因为最近看了一些人做网络程序多年竟毫无建树,一直要用别人写的网络模块,所以有感而写此文,为了使得此文不受上一篇《我的iocp模块》的影响,我决定写之前不看原来的文章,所以此文跟原文那篇文章可能没有太多相似性。一个基本的网络模块,无非就是管理N个连接,快速处理每个连接的收发数据、消息等,所谓好的网路模块原创 2010-10-03 00:27:00 · 2919 阅读 · 13 评论 -
我的网络模块设计第一版
<br />我的IOCP网络模块设计<br /> <br />为了设计一个稳定易用高效的iocp网络模块,我前前后后花了好几个月的时间,也曾阅读过网上很多资料和代码,但是非常遗憾,能找到的资料一般都说得很含糊,很少有具体的,能找到的代码离真正能商用的网络模块差得太远,大多只是演示一下最基本的功能,而且大多是有很多问题的,主要问题如下:<br />1、 很多代码没有处理一次仅发送成功部分数据的情况。<br />2、 几乎没有找到能正确管理所有资源的代码。<br />3、 大多没有采用用pool,有的甚至原创 2010-10-03 00:25:00 · 2013 阅读 · 1 评论 -
关于内存数据库
<br /><br /> <br /> <br />最近要将一些数据放到内存里面做很高的并发操作,考虑了很多方案,<br />1、 简单点使用maphash_map等自己管理。<br />2、 用sqlite内存表。<br />3、 用fastdb内存数据库。<br />4、 用ExtremeDb,TimesTen等。<br />比较测试了一下123,发现还是自己实现速度最快,比fastdb模式快3-5倍,fastdb模式比sqlite内存表模式快10倍左右,由于自己实现不具有典型通用性,多线程原创 2011-01-21 22:27:00 · 1662 阅读 · 2 评论 -
让后端服务器支持memcached协议
<br /><br /> <br />由于原先的appserver功能不断增多,最近又增了两个功能,需要不断从后端memcached中提取数据并进行计算,由于提取数据量大且频繁,导致效率很低,粗测了一下,获取数据和格式化等操作花了90%以上的时间,由此设想将memcached改写或重写一个支持memcached的服务器,将计算功能和memcached做到一起,让获取数据的路径最短,也就最大限度减少了数据传输和格式化等操作,就是类似存储过程一样啦,这部分可以考虑使用插件来实现,甚至可考虑使用脚本语言来实现。<原创 2011-01-23 17:10:00 · 1161 阅读 · 0 评论 -
一套网络框架的杯具
<br /><br />一套网络框架的杯具<br /> <br /> <br />之前设计了一套网络框架,持续改进了很多年,使用在很多项目上,综合效率还行,也很稳定,一直以来对这套东西信心满满,总以为啥问题都好解决,但最近就有个需求让我选择还是改了下这个框架。<br />之前的框架是这样的,可以开一组N个io线程,可以开一组N个同步线程(默认1个),可以开一组N个异步线程(默认1个),可以开一组N个timer线程(默认1个),可以开一组N个异步线程(默认cpu个),每组可独立受控,每组可支持自定义消息,可支原创 2011-01-26 16:13:00 · 1342 阅读 · 0 评论 -
回调函数的常见实现方式及速度比较
<br />回调函数的常见实现方式及速度比较<br /><br /> <br /> <br />回调函数实在是用得太广泛,回调函数又有多种实现方式,如:<br />1、 静态函数<br />2、 虚函数<br />3、 函数对象<br />4、 传统c函数,通过一个void *传递对象地址,内部强制转换<br />5、 fastdelegate<br />6、 Tr1::function + bind<br />7、 Boost::Function + bind<br />基本上速度是按照由快原创 2011-01-30 11:20:00 · 1929 阅读 · 0 评论 -
Windows下两种iocp实现的差距
<br /><br />Windows下两种iocp实现的差距<br /> <br /> <br />之前几天说过,因为经典iocp实现(以下简称经典实现)多个io线程绑定在一个iocp上,这样内部管理了iocp队列的处理,内部决定是不是需要线程切换,我上次修改的一个版本(以下简称实现2),用了多个io线程,每个iocp队列仅绑定一个io线程,一组用户共享一个io线程,这和经典的多线程epoll模型的做法是很相似的,这样每个io线程是可以独立控制了,但理论上这种做法没有发挥iocp自动管理线程切换的优势,昨原创 2011-02-01 10:49:00 · 5059 阅读 · 3 评论 -
关于app和web的混合服务器
关于app和web的混合服务器 等下载机器实在有些慢,无聊之下继续写篇短文发点感慨。前段时间,为让客户端界面更容易表达一点,将客户端需要展现数据的地方全用html实现了,后端自然要用html格式化信息,通用匹配模式自然是要安排一个web服务器,非http信息走原创 2011-07-05 11:01:18 · 3494 阅读 · 0 评论 -
那些名不副实害人不浅的软件
那些名不副实害人不浅的软件 刚在群内闲聊,又谈到“知名”软件的问题,以俺从业十多年的经验来看,“知名”和优质软件是完全两码事,“知名”未必优质,优质未必“知名”。软件行业存在太多的吹嘘,大到国际巨头,小到3、5个草根的初创公司,几乎没有不夸大其词的。下面就说几个俺的亲身经历,博大原创 2011-07-13 13:20:45 · 1495 阅读 · 2 评论 -
一次全文索引编码实践
前端时间要处理一个即时输入提示和查询功能,一开始由于考虑到一个很特殊的需求,做相似度匹配(就是类似abc能匹配acb),所以用数据库的现成办法都不行,用全文索引也不行,因此第一个版本是前同事java版本,计算最深的一个查询一次执行5分钟,赶进度之下弄了第一个c++版本,直接内存缓原创 2011-07-28 11:03:50 · 1189 阅读 · 0 评论 -
经纬度距离查询优化实例
最近参与开发一个SNS类型的社交程序,里面要记录用户的经纬度,还要按照某个已知位置查询附近的用户,这类应用在社交类产品里面算最常见的了,起初在网上搜索了一下,没找到同类文章,为了实现根据一个已知位置(double lon_me, double lat_me)查询double distance范围内的用户的功能,做了一个最简单的实现,那就是遍历所有lon,lat数据,在客户端计算距离,然后比较距离,原创 2012-02-21 00:24:09 · 4840 阅读 · 2 评论 -
关于模式的那点事
关于模式的那点事 群内在讨论模式的那点事,我就发言了,如下: 做软件除了实现基本的功能之外,很大一块的工作就是适配工作,适配工作就是模块内的函数交互,模块间的函数交互或接口交互(其实就是一组函数),进程间的协议交互等,以及为了这些交互顺利进行的约定规则,如数据类型,内存布局,进出栈方式,分配释放规则,通信协议等。 目前的各种模式无非就是这些交互法则的一个阶段性总结,交互原创 2012-04-18 11:06:37 · 1258 阅读 · 1 评论 -
对protobuf的深入解释
对protobuf的深入解释 对protobuf俺的认识,总结为以下几点:1. pb是一种编码方式。之所以这么说是因为有的人认为它是协议,那就侠义化了,pb本质上就和json、xml类似,是一种编码方式,用pb编码出来的流可以套在任何现有协议里面,作为内容部分,如可以放在http的content区域,或者私有协议的content区域,外面套上(length, type, flag原创 2012-07-06 14:38:43 · 13131 阅读 · 2 评论 -
定时器模块改造
<br />之前的文章讲过,我设计的网络框架有几组线程,分别是io、异步、同步、定时器,各个不同应用server几组线程组合形式不尽相同,简单的可只有io线程,复杂一点的可io+同步,更复杂一点的也可io+同步+异步+定时器,总之我以几组线程的自由组合方式应付各种应用,在我负责的server全是这一套框架实现的,不管是支持几万人连接的服务器,还是只有几个用户连接的内部服务器,这套框架也算是久经考验,稳定运行多年,内部使用也非常简单,如给sync线程组发一个消息只要PostSyncEvent,如果要给异步线程原创 2010-09-11 12:52:00 · 2606 阅读 · 0 评论 -
IT行业能说的人太多能做的人太少
<br />It行业从业十几年,虽然接触的人并不多,但算上网络上有点交往的人,也不算太少,阅读过无数代码,很容易得出这样的感悟,国内it行业能说的人太多,能做的人太少,能说大意就是能说会道,说起来头头是道,从架构到体系到模块到接口都能说得很专业,但实施起来就不行,不但架构做不好,接口定义不清,就连小小模块也未见得可搞定,这样的人实在是太多,之前一直以为一个项目组多几个人总能加快点速度,现在终于明白,一个项目组加几个不合适的人不但不能加速反而要降速,甚至直接导致项目开发失控、失败。关键模块如果让一个不称职的人原创 2010-09-11 14:57:00 · 3954 阅读 · 6 评论 -
云计算实践2
云计算实践2上一篇《基于云计算的价格查询实现》就算是云计算实践1吧,所以这篇就叫《云计算实践2》。其实今年开始研究云计算有一段时间了,约3个月前研究md5破解(http://www.shprog.com/HashCrack.aspx),那个项目就是选来玩云计算的,当时觉得md5破解这个小项目好玩,逻辑很简单,密码字母组合可长可短,规模可大可小,1台机器不嫌少,1万台不嫌多,所以就选中了它,没想到第一个md5破解版本后来演变成了主要是密码数据库的制造,虽然第一版没有做成标准云计算,但也算有个结果,而且存储效率原创 2010-08-31 23:57:00 · 886 阅读 · 0 评论 -
多线程内存池
2、多线程内存池 上一节很简略的说了下单线程内存池,单线程内存池如果要放在多线程环境下使用是不安全的,我们需要进行保护,如何保护,最简单的方法就是加临界区,云风的实现里面是用原子操作模拟一个临界区,我实测跟临界区性能非常接近,甚至很多时候不如临界区,所以我就不追求用原子操作模拟临界区了,还是直接用临界区最简单。 class CMemPool {public:原创 2010-02-04 16:54:00 · 7826 阅读 · 0 评论 -
dlmalloc、nedmalloc
3、dlmalloc、nedmalloc Dlmalloc、nedmalloc等知名分配器估计搞内存池的人都知道,dlmalloc是单线程的,不考虑锁,nedmalloc是多线程的,带锁,其实nedmalloc也是线程缓存式的内存池,具体实现我就不说了,nedmalloc我大致看了一下,dlmalloc我也没有深入分析过。 关于两者分配性能前面都提到过,就不再说了,如果不想自己研究原创 2010-02-04 16:55:00 · 15919 阅读 · 3 评论 -
线程关联的内存池
4、线程关联的内存池 每每想到单线程下内存池飞一般的速度和多线程下蜗牛一般的速度我就不能原谅自己,为什么差这么多,就不能让多线程下内存分配更快一点吗?解决方法有了,那就是让缓存线程化,各个线程有自己私有的缓存,分配的时候预先从当前线程私有缓存分配,分配空了的时候去全局free表取一组freeunit或直接向系统申请一大块缓存(各个线程缓存完全独立),不管具体采用什么方式,速度都大幅度的提高原创 2010-02-04 16:56:00 · 5101 阅读 · 1 评论 -
线程关联内存池再提速
5、线程关联内存池再提速 上一节已经提到问题,解决办法是这样的struct tm_bufunit{ tm_pool *pool; //pool指针 union { tm_bufunit *next; //下一个块指针原创 2010-02-04 16:57:00 · 3725 阅读 · 2 评论 -
0、内存池之引言
0、内存池之引言 这是关于内存池的一系列简短文章,当然它不是短期的研究结果,而是长期使用经验的总结,介绍得可能不会很详细,一些别人介绍得很细节的东西我就基本掠过。转载请署名作者:袁斌 内容如下:1、 单线程内存池。2、 多线程内存池。3、 Dlmalloc nedmalloc4、 实现线程关联的内存池。5、 线程关联内存池再提速。 关原创 2010-02-04 16:49:00 · 3669 阅读 · 0 评论 -
唯一id分配策略
有些时候需要给资源分配一个唯一id(32bit or 64bit or CHAR[N]),这里主要说下分配方法问题。首先我们有个基本前提,如果是单线程分配,那么我们无需下面的方法,直接++value即可(CHAR型无论几线程都可使用GUID)顺序产生不重复序列,下面讨论的方法都是多线程下的分配策略:方法1、 win下做简单的方法莫过于使用InterlocckedIncrement(or I原创 2010-03-12 00:00:00 · 3586 阅读 · 2 评论 -
从web体系学习服务器端程序设计
我一直坚持一个观点,从web体系学习服务器端程序设计,web作为发展最早也是前景最广阔的internet模型,几乎支撑了网络世界一半以上的应用,其他email ftp等传统应用虽然产生时间也很早但几乎都很没落,只有web风采依旧,蓬勃发展,从apache到lighttp到nginx等,一个接一个高性能的web服务器程序分别被开发出来,上层应用cgi, isapi(nsapi), fastcgi助力原创 2010-03-30 12:33:00 · 1589 阅读 · 1 评论 -
俺钟情的Json类
Json在ajax领域很流行,记得当时看过它的介绍后很兴奋,网上找了一些解析json的c和c++代码,不过没有找到特别好的,有的写得不错不过要依赖于boost,有的用c写的不大好用,好在json语法简单,参考了一些c/c++的json解析代码做了一个json类,最近又把去年写的json类修改为unicode下使用,增了一些功能,现在CJsonw可以解析const char *型输原创 2010-04-13 18:51:00 · 1821 阅读 · 1 评论 -
关于tcmalloc
写了tmpool之后又发现居然有tcmalloc,而且比牛逼的ptmalloc好很多,真感叹啊,世界上好东西很多,但需要智慧的眼光去发现。在linux下简单比较了一下malloc和tcmalloc,快的真不是一点点啊,看到好多人用tcmalloc去重编译mysql, squid,nginx等。简单看了下tcmalloc的原理,比我写的tmpool要多一些整理的功能,大概tmpool就是tcmall原创 2010-04-07 15:16:00 · 1723 阅读 · 0 评论 -
HashCrack程序数据及索引设计2
<br />HashCrack程序数据及索引设计2<br /> <br /> <br />上个月写了《HashCrack程序数据及索引设计》里面已经提到早期设计的几种存储方法,最后达到了每条记录15个字节左右的水平,但这个存储效果还是很差的,而且是单体文件,受制于内存限制,后来又设计了几种复合索引格式,支持1万亿记录一个复合索引,下面简单讲讲之后的研究成果。<br />6、将内容区和索引区合并,索引位置不再提供指向内容区的size_t,内容区不再需要,直接在索引区,这样索引区indexnode<br />S原创 2010-06-30 14:12:00 · 826 阅读 · 1 评论 -
从需求角度看NOSQL发展
从需求角度看NOSQL发展早先当640kb就足够使用的观点流行的时候,数据处理规模很小,需求也不多,于是简单的文件存储即可满足需求,发展一段时间之后ISAM之类的简单存储就可满足需求,再之后sql流行,当sql为了适应各种需求变得越来越庞大的时候,效率也止步不前,在将缓存和多线程性能榨取完了之后,sql各项性能还只停留在满足常规应用的地步,难于处理1秒万次以上的读写操作,也难于解决万个以上的并发连接,一般的企业不可能动不动就上硬件,所以nosql发展是时代的需要是需求的推动。当然一般sql对传统企业还是足够原创 2010-06-01 13:46:00 · 986 阅读 · 0 评论 -
Json解析速度问题
<br />一直想测试一下json的解析速度,前些天终于花了一点时间测了一下,在我的破笔记本上,解析一个包含10个元素(各种类型都有)的object型json,1秒钟大概只能解析不到10w次,就算把内存池用到极致也只能解析12.5w次左右,换用自己定义的一种bjson格式,速度快了一些,但也不超过20w次,想想工作量也的确很大,生成一个包含10个子元素的object,需要动态分配最少10次,还要做最少10次hash的insert,还有各种格式的转换工作,里面有array和object还要额外分配容器并处理子原创 2010-08-11 22:04:00 · 9580 阅读 · 1 评论 -
基于云计算的价格查询实现
基于云计算的价格查询实现上篇博客提到价格查询功能,当时正在考虑做成云计算模式,所以当时连多线程都没考虑,就是准备将功能都交给云计算系统的,由云计算内部管理线程和调度问题,所以当时实现就根本不用考虑多线程,现在功能基本实现,下面大致讲讲我的做法。国内很多人谈到全文检索就必提lucene,提到云计算就必提google的map/reduce、amazon的ec2,似乎只有那些东西才叫云计算,咱是实战派,没兴趣口舌之争,在俺看来分布式存储+分布式计算就叫云计算,俺就看了看google的map/reduce论文,照其原创 2010-08-22 16:12:00 · 1083 阅读 · 0 评论 -
time_t的局限性及时间函数设计
time_t的局限性及时间函数设计 time_t早期是32位的,用来表示从1970.1.1开始的秒数,当初设计的时候受制于32位的容量,time_t只能表示136年的时间,而且精度只能到秒,后来time_t修改为64位,但仍然兼容了原来的设计,time_t虽然现在默认64位了但依然精度为秒,这是极大浪费的。系统还有很多time相关的函数,如win下mktime、gmtime、GetSy原创 2012-06-27 11:45:01 · 10355 阅读 · 1 评论