Я работаю над проектом 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
.