基于tls(线程局部存储)的高效timelog实现.

什么是timelog?

我们在分析程序性能的时候,会加入的一些logging信息记录每一部分的时间信息

timelog模块的功能就是提供统一的接口来允许添加和保存logging

 

我们正在用的timelog有几个缺点

1.固定大小,一旦满了就不能加入新的logging

2.每次进入就会有一个全局的lock锁住,非常影响性能

 

这两天基于boost的thread_specific_ptr和circular_buffer实现了一个高效的timelog,主要特点有

1. 几乎不需要任何lock,所以性能理论上会非常高(虽然俺没真正测试过)

2. 使用的是固定大小的环形队列,满了之后把会最老的信息抹去,所以不存在满了就不能加入logging的问题

 

代码

实现很简单

有一点缺陷,懒得改了

 

https://github.com/cutepig123/TestCpp/blob/master/cpp11test/1/mytimelog.cpp

 Known issues

1) 所有timelog_create的timelog现在其实都指向同一个实现,所以无论create多少个其实东西都是一样的

2)线程局部存储里的东西不会自动释放,所以会有内存泄露(除非你的每个线程都用boost thread,具体参考boost文档)

如果程序的线程是固定的,那么没有什么影响

但当程序不停地新建删除线程的时候就会有严重问题

 

Powered by Jekyll and Theme by solid

本站总访问量