flo*_*din 37 c++ performance multithreading
在过去的一年里,我一直在用C++开发一个记录库,并考虑到性能.为了评估性能,我开发了一组基准来比较我的代码与其他库,包括根本不执行日志记录的基本情况.
在我的上一个基准测试中,我测量了当日志记录处于活动状态时以及何时不处理时CPU密集型任务的总运行时间.然后我可以比较时间来确定我的库有多少开销.此条形图显示与我的非记录基础案例相比的差异.
正如您所看到的,我的库("鲁莽")增加了负面开销(除非所有4个CPU核心都忙).启用日志记录时,程序运行速度比禁用日程快约半秒.
我知道我应该尝试将其分解为一个更简单的案例,而不是询问一个4000行程序.但是有很多场所要去除什么,没有假设我会在试图隔离它时让问题消失.我可能会花一年时间做这件事.我希望Stack Overflow的集体专业知识能够使这个问题变得更加浅薄,或者对于那些比我有更多经验的人来说,这个原因是显而易见的.
关于我的图书馆和基准的一些事实:
std::chrono::steady_clock::now()
程序的开头和结尾,并打印差异.我的问题是,如何在启用日志记录库时解释明显的速度增加?
编辑:这是在尝试评论中给出的建议后解决的.我的日志对象是在基准测试的第24行创建的.显然,当LOG_INIT()触及日志对象时,它会触发页面错误,导致图像缓冲区的部分或全部页面映射到物理内存.我仍然不确定为什么这会使性能提高近半秒; 即使没有日志对象,mandelbrot_thread()函数中发生的第一件事就是写入图像缓冲区的底部,这应该具有类似的效果.但是,无论如何,在开始基准测试之前使用memset()清除缓冲区会使一切变得更加清晰.目前的基准是在这里
我试过的其他事情是:
当首次访问未初始化的内存时,页面错误会影响时序。
因此,在第一次调用之前,请std::chrono::steady_clock::now()
通过在 Sample_buffer 上运行 memset() 来初始化内存。
归档时间: |
|
查看次数: |
1210 次 |
最近记录: |