用callgrind追踪不必要的副本

Tracking down unnecessary copies with callgrind

本文关键字:副本 不必要 追踪 callgrind      更新时间:2023-10-16

我正在进行C++项目(光线跟踪器(,我一直在研究并试图优化代码库。我不是C++专家,我肯定我犯过很多初学者的错误,尤其是在意外复制时(见下文(。我一直在尝试查找代码的热点区域,但我注意到callgrind_annotate中输出的前几行大多是内部内存调用:

--------------------------------------------------------------------------------
Ir          
--------------------------------------------------------------------------------
195,515,649  PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir          file:function
--------------------------------------------------------------------------------
14,526,540  src/matrix.cpp:matrix::operator*(tuple const&) const [./rt.debug.exe]
10,603,101  ???:_platform_memmove$VARIANT$Haswell [/usr/lib/system/libsystem_platform.dylib]
7,481,047  ???:tiny_free_no_lock [/usr/lib/system/libsystem_malloc.dylib]
7,290,995  ???:tiny_free_list_add_ptr [/usr/lib/system/libsystem_malloc.dylib]
6,463,127  ???:szone_malloc_should_clear [/usr/lib/system/libsystem_malloc.dylib]
6,411,076  ???:szone_size [/usr/lib/system/libsystem_malloc.dylib]
6,268,455  src/tuple.cpp:tuple::tuple(double const&, double const&, double const&, double const&) [./rt.debug.exe]
4,726,152  src/scene_objects/scene_object.cpp:scene_object::intersect(ray) [./rt.debug.exe]
4,705,650  ???:tiny_malloc_from_free_list [/usr/lib/system/libsystem_malloc.dylib]
4,415,582  ???:free [/usr/lib/system/libsystem_malloc.dylib]
...

很明显,有一些额外的内存分配发生了,如果我知道如何跟踪的话,我不应该删除

那么,我如何更好地跟踪是什么导致了这些额外的内存分配/释放?

注意:我已经在使用-g-O3进行编译了。

valgrind提供了几种方法来跟踪执行大量分配/释放的代码。

除其他外,valgrind memcheck和massif工具提供了一种记录对分配和解除分配函数的完整调用集的方法。然后可以使用kcachegrind等工具对记录的数据进行可视化。

例如,使用memcheck,您可以执行以下操作:

valgrind --tool=memcheck --xtree-memory=full <your_program> <your_args>

然后(默认情况下(会生成一个文件xtmemory.kcg.,您可以使用kcachegrind对其进行可视化。

请参阅https://www.valgrind.org/docs/manual/manual-core.html#manual-core.xtree获取更多信息。

dhat工具还允许检查哪些内存被分配了,但没有被大量或长时间使用。