- C++11
- Linux or MAC OS
O2优化,
单线程写100万条日志600ms左右,多线程速度可提高到每100万日志300-400ms左右
即每秒300w+
但线程过多(超过CPU个数
)可能会退化到单线程的水平.
在进程关闭时候,IO线程退出前,同步等待生产者线程完成.
并且此时将不能再创建新的logger对象,确保迅速收敛.
生产者线程在日志关闭后写日志将得到提示并输出到屏幕.
这一现象并不应该发生,只有在全局对象的析构函数调用日志可能会触发.
由于C++不保证不同编译单元全局对象的构造和析构顺序,在析构函数中做过多的
工作似乎也不是合理的。
每个生产者线程在格式化日志数据的时候是不需要锁的,因为访问的是thread-local数据.
每个生产者线程有独立的输出buffer,通过thread id来索引.
当输出buffer超过阈值,主动唤醒IO线程
唯一的IO线程,将buffer输出到mmap的日志文件中.