- 博客(321)
- 资源 (8)
- 收藏
- 关注
原创 函数调用太快了
在至强服务器上,使用 febird/vcproj/test_trb 测试 trb。结果发现使用compare函数指针的find仅比直接比较快17%!我原本以为至少要快一倍,因为在Windows(PentiumM Dual Core)上,直接比较的版本要快80%左右。经过测试,发现:现代Cpu的流水线真强! long long t32 = pf.current();
2009-06-10 19:55:00 1071
原创 函数指针之间的比较
因为某种原因(Threaded Red black tree C++ warpper),需要比较两个函数指针是否相等。但是,这么貌似很简单的需求却得不到满足。下表,是在Visual C++ 2008 中,同一个函数通过不同途径得到的指针key_comp0x0041158c _febird_trb_compare_lessfebird::G
2009-06-02 18:20:00 2482 3
原创 骂人的最高境界
这个世界上奇人真不少:http://www.tianya.cn/publicforum/content/feeling/1/931833.shtml
2009-06-02 17:53:00 885
原创 Threaded Red-Black Tree 线索红黑树
项目地址:http://code.google.com/p/febird 使用 libavl 中的 trb ,经过修改,实现了一个更高效更友好易用的版本,并且也支持范围查询,提供完备的std::map/set接口。对基本类型的key,实现高效search支持 lower_bound/upper_bound/equal_range结点采用压缩方式,将colorbit(1bit
2009-05-26 19:19:00 3287
Threaded Red-Black Tree 线索红黑树
项目地址:http://code.google.com/p/febird 使用 libavl 中的 trb ,经过修改,实现了一个更高效更友好易用的版本,并且也支持范围查询,提供完备的std::map/set接口。对基本类型的key,实现高效search支持 lower_bound/upper_bound/equal_range结点采用压缩方式,将colorbit(1b...
2009-05-26 19:19:00 80
原创 发现用混合C的C++很难写出完全正确的程序
#include #include #include using namespace std;struct A { A() { printf("A::A()/n"); } ~A() { printf("A::~A()/n"); }};struct G { G() { printf("G::G()/n"); } ~G() { printf("G::~
2009-05-04 18:50:00 1203 1
原创 很久以前发现的 vc2008 的一个bug(关于模板匹配)
使用操作符重载时,出现模板匹配错误,bug 的出现很简单,下面是代码:#include #include struct A1{ template void operator& x) { printf("void operator& x)/n"); }};struct A2{ void operator<
2009-04-18 23:44:00 1160
原创 vc2008 比 gcc4.3 真是差太多了
项目地址:http://code.google.com/p/febird 用gcc4.3重新编译了一下febird,出现了很多错误,仔细观察,这些错误都是因为不符合C++标准,重新改成符合标准的,比想象的改动量要大。又测试了一下纯 C 实现的 algorithm: febird.c,是从VC2008的stl代码改过来的,在VC2008中测试比std::sort快20%,但是一到gcc中,却
2009-04-18 23:25:00 1578
原创 vc 鲜为人知的 __if_exists
msdn 中有这样一个示例:// the__if_exists_statement.cpp // compile with: /EHsc #include template class X : public T { public: void Dump() { std::cout ::Dump(
2009-04-15 12:48:00 2169
原创 检查序列化声明的顺序和成员定义的顺序
DataIO_is_realdump用来推断一个对象是否可以直接通过dump内存来完成序列化,如果可以,在load/save时会有极大的性能提高。如果dump后,一些成员除了需要byte_swap,而不需要其它任何转化,也可以安全地先dump然后再byte_swap,这样比一个成员一个成员地load/save并且byte_swap要快得多。但是可以引发一个问题,就是如果序列化声明的顺序和成员定
2009-04-11 16:15:00 1488
检查序列化声明的顺序和成员定义的顺序
项目地址:http://code.google.com/p/febird DataIO_is_realdump用来推断一个对象是否可以直接通过dump内存来完成序列化,如果可以,在load/save时会有极大的性能提高。如果dump后,一些成员除了需要byte_swap,而不需要其它任何转化,也可以安全地先dump然后再byte_swap,这样比一个成员一个成员地load/save并且by...
2009-04-11 16:12:48 146
febird.rpc echo 代码
// echo.hclass Echo : public GlobaleScope{public: BEGIN_RPC_ADD_MF(Echo) RPC_ADD_MF(echo) END_RPC_ADD_MF() // 3rd macro param is ';' means non-pure-virtual RPC_DECLARE_MF_EX(echo,...
2009-04-08 12:12:48 141
febird.rpc 实现技术
使用C++模板实现不需要IDL的RPC IDL的数据定义由几个宏定义实现: RPC_DECLARE_MF(FunName, ArgList)声明函数,ArgList必须带括号BEGIN_RPC_ADD_MF_EX(ThisClass,ClassName)BEGIN_RPC_ADD_MF(ThisClass)开始注册函数E...
2009-04-08 11:26:45 473
febird.dataio 序列化宏
序列化宏DATA_IO_LOAD_SAVE(Class,Members)在类定义内调用,无版本,可以优化DATA_IO_LOAD_SAVE_E(Class, Members)在类定义外调用,无版本,可以优化DATA_IO_LOAD_SAVE_V(Class, CurrentVersion, Members)在类定...
2009-04-08 11:23:03 199
C 语言实现的 stl-like 算法
使用类似BOOST.PP技巧,自动生成代码,效率上小胜stl,主要抽象出一般的(sort/heap/search)算法中的compare,按成员类型、偏移、类尺寸分派至不同函数;性能比stl相应算法还略高,用法更简单:#include <febird/c/algorithm.h>using namespace std;struct A { int x, y; }; ...
2009-04-08 10:46:38 254
原创 febird.dataio vs boost.serialization 运行性能对比
本博客已迁移至: http://www.nfabo.cn/p/?p=65代码表示的是数据格式,DATA_IO_LOAD_SAVE 在 <febird/io/DataIO.h> 中定义对boost,DATA_IO_LOAD_SAVE 的定义相当于:
2009-04-06 20:09:00 4678 4
febird.dataio vs boost.serialization 运行性能对比
代码表示的是数据格式,DATA_IO_LOAD_SAVE 在 <febird/io/DataIO.h> 中定义对boost,DATA_IO_LOAD_SAVE 的定义相当于:#define DATA_IO_LOAD_SAVE(Class, Members) \ friend class boost::serialization::access; \ te...
2009-04-06 20:09:00 126
原创 febird.dataio和boost.serialization 编译速度对比
项目地址:http://code.google.com/p/febird 和boost.serialization性能对比运行性能以下数据是对POD数据,都使用典型用法。febird使用DATA_IO_LOAD_SAVE(Class, &a&b&c) boost也使用这样的简化形式:#define DATA_IO_LOAD_SAVE(Class, Members)
2009-04-06 20:07:00 3022 2
febird.dataio和boost.serialization性能对比
和boost.serialization性能对比运行性能以下数据是对POD数据,都使用典型用法。febird使用DATA_IO_LOAD_SAVE(Class, &a&b&c) boost也使用这样的简化形式:#define DATA_IO_LOAD_SAVE(Class, Members) \ friend class boost::s...
2009-04-06 20:07:00 115
原创 febird.dataio 优化技术
项目地址:http://code.google.com/p/febird 优化技术主要有两点:1. 优化的inlinea) 频繁调用的函数都使用inline,但是值得注意的是,在inline的时候,只inline最频繁的分支,很少走到的分支使用非inline函数,例如:void InputBuffer::ensureRead(voi
2009-04-04 12:45:00 1634
febird.dataio 优化技术
优化技术主要有以下几点:1. 优化的inlinea) 频繁调用的函数都使用inline,但是值得注意的是,在inline的时候,只inline最频繁的分支,很少走到的分支使用非inli
2009-04-04 12:45:00 306
原创 死得离奇
今天才看到那个潘星谊被鱼缸kill掉了,太离奇了!最让我想不通的是,她那么有钱,怎么买了个劣质鱼缸哪?还是奸商以次充好,用高档鱼缸的价格,却给了个劣质鱼缸?可以预见的事情是,鱼缸产业在一段时间内会遇到冲击,就像三路奶粉,短期内没人敢买鱼缸了。最近两年,离奇的,荒谬的事情是一件接一件,是新闻更加开放了呢?还是离奇事件更多了?自然想起,我小时候拿着一瓶罐头跑,结果因为刚下完雨,地面湿滑
2009-02-23 12:07:00 863
死得离奇
今天才看到那个潘星谊被鱼缸kill掉了,太离奇了!最让我想不通的是,她那么有钱,怎么买了个劣质鱼缸哪?还是奸商以次充好,用高档鱼缸的价格,却给了个劣质鱼缸?可以预见的事情是,鱼缸产业在一段时间内会遇到冲击,就像三路奶粉,短期内没人敢买鱼缸了。最近两年,离奇的,荒谬的事情是一件接一件,是新闻更加开放了呢?还是离奇事件更多了?自然想起,我小时候拿着一瓶罐头跑,结果因为刚下完雨,地面湿滑,摔了一...
2009-02-23 12:07:00 88
原创 qq 的程序员真蠢
今天新装了vista,顺便装了最新的qq 2009 beta,这次它提示个人信息的保存位置,还好,有点顺应趋势。为了安全,我安装软件用的是 Administrator 账户,然后再开一个低权限账户作为日常使用。可是让我大跌眼镜的是:当我在低权限账户中的时候,开始菜单中竟然没有qq!于是到它的安装目录下,往桌面创建一个快捷方式,运行起来以后,它竟然没有把个人信息保存在“文档”中,安装时的那个
2009-02-21 22:13:00 1382 1
qq 的程序员真蠢
今天新装了vista,顺便装了最新的qq 2009 beta,这次它提示个人信息的保存位置,还好,有点顺应趋势。为了安全,我安装软件用的是 Administrator 账户,然后再开一个低权限账户作为日常使用。可是让我大跌眼镜的是:当我在低权限账户中的时候,开始菜单中竟然没有qq!于是到它的安装目录下,往桌面创建一个快捷方式,运行起来以后,它竟然没有把个人信息保存在“文档”中,安装时的那个选项...
2009-02-21 22:13:00 165
原创 侏罗纪公园
侏罗纪公园,很久以前就下载了,一直没看,前天看了1,现在正看2,总体上感觉,情节设计有严重问题。主要是对我的是非观的颠覆。既然一切都是“设计”出来的,在1里面,明明是个人的错误(那个白痴胖子偷胚胎),却被扩展成整个系统的错误——这部电影主要是宣扬这个主题。就像世贸大厦被恐怖分子袭击了,然后我们不怪罪恐怖分子,却怪罪楼盖得不结实,如果也拍一部电影宣扬这个主题,我们大家怕是都要笑导演弱智,奇怪的是
2009-02-01 19:59:00 1062
侏罗纪公园
侏罗纪公园,很久以前就下载了,一直没看,前天看了1,现在正看2,总体上感觉,情节设计有严重问题。主要是对我的是非观的颠覆。既然一切都是“设计”出来的,在1里面,明明是个人的错误(那个白痴胖子偷胚胎),却被扩展成整个系统的错误——这部电影主要是宣扬这个主题。就像世贸大厦被恐怖分子袭击了,然后我们不怪罪恐怖分子,却怪罪楼盖得不结实,如果也拍一部电影宣扬这个主题,我们大家怕是都要笑导演弱智,奇怪的是好...
2009-02-01 19:59:00 242
原创 asio/ACE/apr/libevent
整体感觉:ACE太庞大,asio 太赶时髦。ACE太过庞大,使得你即便是只使用它的一小部分,也不得不引用它的全部。而且框架一大堆,模式一个加一个,很多编程习惯也要改变。学习曲线太陡,也难以将它作为一个模块集成自己的应用。asio呢,有个牛大大说它是现时代的ACE,我觉得比较中肯。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。我说的不光是运行时的内存和时间代价,更重要的编译时
2009-01-04 22:35:00 5129
asio/ACE/apr/libevent
整体感觉:ACE太庞大,asio 太赶时髦。ACE太过庞大,使得你即便是只使用它的一小部分,也不得不引用它的全部。而且框架一大堆,模式一个加一个,很多编程习惯也要改变。学习曲线太陡,也难以将它作为一个模块集成自己的应用。asio呢,有个牛大大说它是现时代的ACE,我觉得比较中肯。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。我说的不光是运行时的内存和时间代价,更重要的编译时间难...
2009-01-04 22:35:00 264
原创 关于变量名的一点感想
变量的命名规则,一般有这么几种:1. 骆驼规则,如 Windows Api 的命名规则(CreateFile/GetDiskFreeSpaceEx),Java 类名的规则 2. 首单词小写,如Java方法名(readByte)3. 下划线分隔单词,如C++标准库(lower_bound/equal_range)4. 全部小写,无分隔,如unix(posix)的很多函数名(getpa
2009-01-04 11:07:00 1002 2
关于变量名的一点感想
变量的命名规则,一般有这么几种:1. 骆驼规则,如 Windows Api 的命名规则(CreateFile/GetDiskFreeSpaceEx),Java 类名的规则 2. 首单词小写,如Java方法名(readByte)3. 下划线分隔单词,如C++标准库(lower_bound/equal_range)4. 全部小写,无分隔,如unix(posix)的很多函数名(getpagesi...
2009-01-04 11:07:00 85
原创 最便捷、最强大、速度最快的C++序列化框架【二】
项目地址:http://code.google.com/p/febird 目前该框架(DataIO)仅支持二进制。想起序列化支持只需要一个宏DATA_IO_LOAD_SAVE/DATA_IO_LOAD_SAVE_V,对象成员基本上用“&”连接起来,这样,可以写一个简单的语法分析器,将成员序列化表达转化成字符串,然后进行语法分析,这样,就可以在不用改变客户代码的情况下,进行文本方式(如XML
2009-01-02 14:24:00 1364
序列化如何简洁地支持XML
目前该框架(DataIO)仅支持二进制。想起序列化支持只需要一个宏DATA_IO_LOAD_SAVE/DATA_IO_LOAD_SAVE_V,对象成员基本上用“&”连接起来,这样,可以写一个简单的语法分析器,将成员序列化表达转化成字符串,然后进行语法分析,这样,就可以在不用改变客户代码的情况下,进行文本方式(如XML)的序列化了,比boost的要简单许多。如,目前的宏这样定义:#...
2009-01-02 14:24:00 99
原创 Coroutine真的可以大幅提高效率吗?
这段时间一直想用Coroutine来实现我的rpc中异步调用的分派。看了很多Coroutine的资料,感觉它比起线程切换,就是少了个内核调用,少了自动激活,以及一些内和支持的线程状态(errno,tls等)。在处理器状态的存储/恢复,堆栈的切换等方面的开销都是一样的。在x86这样的体系结构下,处理器的状态(寄存器状态)很少,就那么几个寄存器,存储/恢复起来很快。但是,象MIPS,甚至Itaniu
2009-01-02 14:02:00 1673
Coroutine真的可以大幅提高效率吗?
这段时间一直想用Coroutine来实现我的rpc中异步调用的分派。看了很多Coroutine的资料,感觉它比起线程切换,就是少了个内核调用,少了自动激活,以及一些内和支持的线程状态(errno,tls等)。在处理器状态的存储/恢复,堆栈的切换等方面的开销都是一样的。在x86这样的体系结构下,处理器的状态(寄存器状态)很少,就那么几个寄存器,存储/恢复起来很快。但是,象MIPS,甚至Itaniu...
2009-01-02 14:02:00 158
原创 使用C++模板实现不需要IDL的RPC【二】
项目地址:http://code.google.com/p/febird IDL的数据定义由几个宏定义实现: RPC_DECLARE_MF(FunName, ArgList)声明函数,ArgList必须带括号BEGIN_RPC_REGISTER_MF_EX(ThisClass,ClassName)BEGIN_RPC_
2009-01-02 14:00:00 2468
原创 process-->thread-->coroutine
在现实世界中,基本是是按着这样的顺序演化:process-->thread-->coroutine/fiber其实是一个context切换开销从大到小的演化,process切换开销最大,需要切换地址空间,所有的CPU状态,所有其他资源thread切换只需要切换CPU状态,当然是大部分的CPU状态,而coroutine切换,只需要切换很少的CPU状态,而且全部都在用户地址空间运行,不需要到内
2008-12-11 23:50:00 1602
process-->thread-->coroutine
在现实世界中,基本是是按着这样的顺序演化:process-->thread-->coroutine/fiber其实是一个context切换开销从大到小的演化,process切换开销最大,需要切换地址空间,所有的CPU状态,所有其他资源thread切换只需要切换CPU状态,当然是大部分的CPU状态,而coroutine切换,只需要切换很少的CPU状态,而且全部都在用户地址空间运行,不...
2008-12-11 23:50:00 137
原创 about boost::shared_ptr
boost::shared_ptr 对象中,有两个成员一个是对象 ptr,一个是引用计数类的指针,由于某种原因,我希望把 shared_ptr 放入一个指针大小的地方,却无法实现,只能用 intrusive_ptr,但是牵涉到的类又太多,改起来不现实,仔细想一下,其实 shared_ptr 完全可以只有一个指针大小,只要把对象指针放到引用计数类中就可以了,为什么shared_ptr作者不这么干?是
2008-12-11 12:59:00 1067
about boost::shared_ptr
boost::shared_ptr 对象中,有两个成员一个是对象 ptr,一个是引用计数类的指针,由于某种原因,我希望把 shared_ptr 放入一个指针大小的地方,却无法实现,只能用 intrusive_ptr,但是牵涉到的类又太多,改起来不现实,仔细想一下,其实 shared_ptr 完全可以只有一个指针大小,只要把对象指针放到引用计数类中就可以了,为什么shared_ptr作者不这么干?是...
2008-12-11 12:59:00 230
febird C++ 库(附带所有源码)
2009-04-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人