用callgrind追踪不必要的副本
Tracking down unnecessary copies with callgrind
我正在进行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工具还允许检查哪些内存被分配了,但没有被大量或长时间使用。
相关文章:
- 用callgrind追踪不必要的副本
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 总和的不必要行为C++?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在插入排序中使用 replace() 使语句变得不必要
- C 包装器C++库周围没有不必要的头文件
- 编译器是否消除了不必要的原子?
- 在 c++ 中不必要的包含
- GCC为AVR上的简单ISR产生不必要的寄存器推送
- 在序列化过程中删除不必要的内存分配
- QTREEWIDGET子分类,停止下降指示器显示给定有不必要的DropIndicatorPosition
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- Android Gradle避免了CMake项目不必要的重建
- 构造向量时如何摆脱(一个)不必要的副本
- 处理对“vector_binary_operation”类中“表达式”的引用,而无需不必要的副本
- 在调用C++/STL算法时,可视化消除了不必要的副本
- 在构建复合对象时消除不必要的副本
- 在汇编代码中查找不必要的缓冲区副本