自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

whinah的专栏

terark.com可检索压缩技术作者。致力于让数据更小,访问更快。

  • 博客(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 &lt;febird/c/algorithm.h&gt;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 在 &lt;febird/io/DataIO.h&gt; 中定义对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, &amp;a&amp;b&amp;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.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优化的inlinea)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 频繁调用的函数都使用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,对象成员基本上用“&amp;”连接起来,这样,可以写一个简单的语法分析器,将成员序列化表达转化成字符串,然后进行语法分析,这样,就可以在不用改变客户代码的情况下,进行文本方式(如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--&gt;thread--&gt;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

C++ Best Practice (高阶教程)

你所不知道的C++,临时变量、重载、模板、异常……等等你所不知道的细节

2013-02-25

有穷自动机的原理及应用

有穷自动机,自动机最小化,串匹配,压缩,性能

2013-02-22

对称冗余集群架构

对称冗余集群架构 容错 Memcached

2011-10-18

Text Clustering

2007年的一个项目,对文章进行聚类分析,近千万篇文章,4核4G 的低端服务器即可有效处理并提供在线服务

2011-10-18

HadoopStreaming

写的一个 Hadoop Streaming 教程

2011-10-18

MapReduce应用

2009年写的,刚才看最后修改日期是2009年11月

2011-10-18

Hadoop.MapReduce.分析

2009年7月份写的一篇 Hadoop.MapReduce 介绍

2011-10-18

febird C++ 库(附带所有源码)

febird implemented a serialization framework(vs boost.serialization/google.protocolbuffer), can be used in protocol parsing, big/small data serialization, even in very small object serialize, performance is good. (such as key/data serialization in BerkeleyDB), it provide fast performance(30~80 times faster than boost.binary_archive), and lower memory usage. febird.rpc is a C++ remote procedure call without an IDL supporting, it based on the serialization framework. febird.rpc provide convenient usage and fast performance, and an uniform coding style. febird 实现了一个序列化框架(对比boost.serializaiton/google.protocolbuffer),可以用在协议解析,大/小数据的序列化,有极高的性能(比boost.binary_archive快30~80倍),甚至对于非常小的对象,例如只有几个字节的对象,这在序列化BerkeleyDB中key/data这么小的对象(可能只是一个整数/变长整数)时非常有用。 该库提供了对BerkeleyDB的序列化封装,可以象使用std::map一样使用它。 该库也实现了一个不需要IDL的rpc,使用几个宏,很方便的自动完成函数参数的序列化,比MFC的MessageMap?还要方便。 使用时请checkout最新版,下载的那个版本比较旧了 @see http://blog.csdn.net/whinah http://blog.csdn.net/whinah/archive/2008/11/07/3248730.aspx http://blog.csdn.net/whinah/archive/2008/11/07/3248770.aspx

2009-04-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除