在过去的一年里,我在C++中开发了一个日志库,考虑到了性能。为了评估性能,我开发了一套基准来比较我的代码和其他库,包括一个根本不执行日志记录的基本案例。
在我的上一个基准测试中,我测量了一个CPU密集型任务的总运行时间,而日志记录是活动的,而不是的。然后,我可以比较时间,以确定我的库有多少开销。这张条形图显示了与我的非日志记录基本情况相比的差异。

如您所见,我的库(“鲁莽”)增加了负开销(除非所有4个CPU内核都很忙)。当启用日志记录时,程序运行速度比禁用时快约半秒。
我知道我应该尝试把这个问题归结为一个更简单的情况,而不是询问4000行程序。但是有那么多的场所可以去除什么,没有一个假设,当我试图隔离它的时候,我只会让问题消失。我可能还能再花一年时间来做这个。我希望Stack溢出的集体专业知识会使这成为一个更肤浅的问题,或者对比我更有经验的人来说,原因是显而易见的。
关于我的图书馆和基准的一些事实:
std::chrono::steady_clock::now(),然后打印差异。我的问题是,当启用日志库时,我如何解释明显的速度增长?
编辑:这是在尝试了在评论中给出的建议之后解决的。我的日志对象是在基准测试第24行上创建的。显然,当LOG_INIT()接触到日志对象时,它会触发一个页面错误,导致图像缓冲区的部分或所有页面被映射到物理内存。我仍然不知道为什么这会使性能提高近半秒;即使没有日志对象,mandelbrot_thread()函数中发生的第一件事就是写入图像缓冲区的底部,这应该有类似的效果。但是,无论如何,在启动基准测试之前,使用memset()清除缓冲区会使一切变得更加正常。当前的基准测试是这里
其他我尝试过的事情是:
发布于 2015-07-29 08:51:56
当第一次访问未初始化内存时,页面错误将影响定时。
因此,在第一次调用std::chrono::steady_clock::now()之前,通过在sample_buffer上运行memset()来初始化内存。
https://stackoverflow.com/questions/30152288
复制相似问题