为了实现这样的性能指标,muduo日志库的实现有几点优化措施值得一提:· 时间戳字符串中的日期和时间两部分是缓存的,一秒之内的多条日志只需重新格式化微秒部分[插图]。例如p.111出现的3条日志消息中,“20120603 08:02:46”是复用的,每条日志只需要格式化微秒部分(“.125770Z”)。· 日志消息的前4个字段是定长的,因此可以避免在运行期求字符串长度(不会反复调用strlen [插图])。因为编译器认识memcpy()函数,对于定长的内存复制,会在编译期把它inline展开为高效的目标代码。· 线程id是预先格式化为字符串,在输出日志消息时只需简单拷贝几个字节。见CurrentThread::tidString()。· 每行日志消息的源文件名部分采用了编译期计算来获得basename,避免运行期strrchr(3)开销。见SourceFile class,这里利用了gcc的内置函数
https://github.com/chenshuo/muduo/blob/master/muduo/base/AsyncLogging.cc
No comments yet.