Recent Posts
-
September 01, 2012
如何用perf分析程序缓存访问性能(转)
微博看到有人分析一篇文章 “Memory Access Patterns Are Important”通过java的例子来测试 内存访问时的“线性访问” “随机跨page访问” “随机跨大范围的heap访问”, 当然是第一个缓存局部性好,混存命中率更好了。文章结合源码和perf使用的例子,用perf查看程序的 第一级 第二级 第三级缓存的命中率, Translation Lookaside Buffers (TLBs) 命中,Hardware Pre-Fetchers等,实在是个不错的参...
-
September 01, 2012
Zeromq抱怨c++ 第二篇,导致内存碎片化
http://www.250bpm.com/blog:8前面第一篇说的c++的异常处理机制,这个说的面向对象的设计导致的内存碎片化。都很有道理,我也是很赞同文章的观点的。前段时间我也文章所说的list的删除和内存碎片问题。当时用 stl的list来做 队列,cancel操作的时候发现想把元素自身从队列删掉,c++的支持根本就不行,默认的删除是O(n)的,后来是就是按照 linux内存的list 自己实现了队列,也就是 文章所说的c方式的实现。再后来发现使用 iterator 也是可以做到 ...
-
August 02, 2012
Linux 内核 ftrace 实现原理 和gcc的性能分析选项 Pg
在这里http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html 看到 ftrace的实现原理,觉得很有意思的用法。 linux 内核里面配置了开启ftrace之后,利用 gcc 的 -pg 选项,让每个内核函数的开头自动插入调用 mcount函数的代码。gcc 的 -pg选项是为了性能测试用的,但不知道ftrace还能利用到这点。ftrace实现了自己的mcount函数,这样就可以在每个内核函数调用到的时候i进...
-
June 14, 2012
C++字符串查找和匹配相关数据结构trie ,radix Tree,hat Trie,hash table和最好的字符串哈希函数fnv 1a
现在认为Murmurhash3 和CityHash 还有SpookyHash都比fnv这个算法要快吧。参考http://gmd20.blog.163.com/blog/static/16843923201362985128582/Trie 就是字典树http://en.wikipedia.org/wiki/Trie里面有个rie和 red black tree (红黑树)和hash table的性能比较的图,也有一些特点对比的介绍Gnu c++ std 的实现里面的容器http://gc...
-
June 14, 2012
C++ std list 是可以做到像linux 内核的list一样o(1)复杂度把元素从链表里面删掉的(std iterator的用法)
之前不知道iterator 还可以这样使用啊,搞到我想自己写了类似Linux内核的一个list的实现。可以把 list<Request*>::iterator 其实就是链表节点来的,整个list的其他元素的添加删除不会影响到你这个iterator 的。所以插入元素到list容器的时候,顺便把:iterator 这个也保存到元素自己一个子变量。然后需要删除的时候,根据iterator来删除就可以了。vector那些的iterator 类似普通的数组指针,但vector会自动...
-
June 12, 2012
C++ 单例模式 和静态变量初始化顺序导致的dll加载失败问题
C++如果有很多静态变量处于不同的文件里面,静态变量的初始化顺序是不确定的。碰到一个bug,就是单例模式 静态变量实例A的构造函数里面去调用 类B的静态函数, B的这个静态函数里面访问了自己的静态成员编码C。结果A初始化实在B的静态变量的前面的,所以程序就crash了。因为是在静态变量的构造函数里面失败的,就只会出来一个对话框提示DLL初始化失败,如果是用loadlibrary的也会提示dll加载不成功的。 好像在类的构造函数里面,很容易碰到这种依赖初始化顺序导致的bug啊...
-
June 04, 2012
C++ 的placement new () 语法,在指定内存地址构建对象
经常看到这种用法,在这里又看到一个了https://github.com/facebook/folly/blob/master/folly/ProducerConsumerQueue.h最简单的, “new (指定的地址) ” 其实就是 在 指定的地址已经存在的内存上面调用构造函数建新的对象。 有时可以避免动态申请内存,提高性能,例子参考上面文件里面queue里面插入元素的构建。解释可以参考下面这两个。Placement syntaxhttp://en.wikipedia.org/wiki...
-
May 31, 2012
Linux tcpdump抓包程序原理,pf_packet socket接口相关的实现
PF_PACKET 往是专门用于抓包的,往系统网络层注册一个协议。然后所有的往外发的包和进来的包都会调到http://lxr.linux.no/linux+v3.4/net/packet/af_packet.c 这个文件里面 的packet_rcv() 函数,其中 outgoing方向(出去的包)会在 dev_queue_xmit_nit里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。incoming 方向(从外面其他机器进来的包会在 neti...
-
May 25, 2012
C++ template 模板实现分开在头文件和源文件导致的linker找不到函数实现的链接错误
C++的模板的代码,最好全部放在一个头文件里面,不然编译的时候,可能看到链接器找不到模板函数的错误。简单的就是模板的实例化的时候找不到定义。书中给出了好几种解决办法除了 全部放在头文件的 这种“Inclusion Model”办法之外,还有利用C++关键字 export的办法,其他几种办法自己去看书吧。上次一个同事碰到这个问题了,我当时也不知道。不知道以后会不会忘记了,记录一下便于查找方便。C++ Templates - The Complete Guide.pdf 一书的Chap...
-
May 21, 2012
Zeromq 基于无锁消息队列(lock Free的pipe)的无锁多线程模型 (actor model) 比较有意思的
原文地址: ZeroMq的架构文档http://www.aosabook.org/en/zeromq.html强烈建议读一下这个吧在线源码:https://github.com/zeromq/libzmq/tree/master/src1.i_engine.hpp -> stream_engine.hpp有多种继承自i_engine的类调用socket api的代码就是在这里面。2.socket_base.hpp -> xsub_socket_t session_base...