异步记录器真的有助于提高性能吗
Do Asynchronous Loggers really help in performance?
我们知道同步日志记录,将日志消息写入文件,然后继续执行程序。异步记录器将日志消息排队,并将它们写入一个单独的线程中。我开始在我的项目中实现Log4CPlus,我想到了几件事。
我无法初始化更多的LogObjects,因为这将打开更多的文件句柄,而我们不需要。(我知道我们应该使用基于功能的日志记录对象,例如UploadLogObj、DownloadLogOb、WebReqLogObj和AuthLogObj等)。希望每增加一个日志对象也能增加日志线程。
还是为了论证起见,如果我使用单个日志对象并从多个线程推送日志消息,我认为必须有一些互斥锁来防止写入消息队列。我的问题是,这个互斥锁不会减慢进程,不会造成性能问题吗。。?
我只是想知道异步记录器是如何工作的,我可以查看代码,这是一种方法。但希望这些答案能对很多人有所启发。
是的,互斥会稍微减慢进程,但如果您从多个线程记录到同一个目标,您无论如何都需要某种形式的同步,因为您不希望来自不同线程的行混合在一起。
最后,这是一个决定在哪里同步的问题,而不是如果。对于异步日志记录,当要记录的对象被推送到日志记录线程的队列时,就会发生这种情况。在同步的情况下,可能是在写行的时候(尽管这取决于实现)。
在第一种情况下,由于在互斥体中不会发生磁盘刷新,因此在互斥体内部花费的时间将更短,并且是可预测的。这意味着,与第二种情况相比,您可能会有更少的性能降级和更好的扩展(加上您没有花在写实际数据上的时间,因为其他线程正在处理它)。
如果你没有很多线程在争夺互斥,那也没什么问题。不久前,我有机会为实时系统编写并使用异步记录器,早在同步问题出现之前,我们就遇到了与磁盘带宽相关的问题。
异步日志记录的一个缺点是与内存有关:由于需要传递要记录的数据,因此需要小心,避免不必要的分配/释放。
在现代硬件上,互斥锁大约需要40-60纳秒(如果互斥没有被另一个线程锁定)。与IO操作相比,这算不了什么,IO操作理论上可以将文件写入速度较慢的HDD或网络驱动器几秒钟。
无锁是另一回事——在这种情况下,您甚至没有互斥对象。然而,这是有代价的——你必须编写一个更复杂的代码。
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- C++模板是否有助于定义单行'property'成员?
- 从 16UC3 到 8UC3 的高性能 OpenCV 矩阵转换
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- 如何从高性能的输入迭代器返回变体?
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- 编写高性能C++二传手
- 提升图形库:以高性能的方式检查vertex_descriptor的有效性
- 递归函数有助于显示反向数字
- 未定义的行为确实有助于现代编译器优化生成的代码
- static_assert有助于优化编译器吗?
- 高性能程序,什么是更好的矢量数组或矢量的矢量
- C ++什么设计将有助于避免使用侦听器时的多重继承
- 如何在不使用函数或类的情况下重复代码段,以便在C++中实现高性能循环
- 修改顺序是否有助于发生在关系之前
- __ -builtin_unreachable有助于哪些优化
- 标准::矢量的高性能替代品
- 在Qt中以高性能方式将(富)文本附加到QTextEdit或QTextBrowser中
- 在字典中查找单词模式,高性能