GProf: Что такое __cosl_internal и __sinl_internal функции?
Я профилировал свою программу с помощью gprof и заметил, что в верхней части экрана отображается следующее:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
17.50 6.69 6.69 _mcount_private
12.14 11.33 4.64 __cosl_internal
11.02 15.54 4.21 __sinl_internal
Я довольно интенсивно использую функции косинуса и синуса из библиотеки cmath, и поскольку имена cos и sin указаны в именах этих вызовов функций, возможно, это могут быть и те, и другие. Тем не менее, дальше вниз по профилировщику у меня тоже есть
% cumulative self self total
time seconds seconds calls s/call s/call name
2.93 23.25 1.12 cos
2.51 24.21 0.96 sin
что сбивает с толку, поэтому я не совсем уверен, что на самом деле означает __cosl/sinl_internal. Не получил значимых результатов при попытке Google решить проблему.
Вот используемая команда сборки:
i686-w64-mingw32-g++.exe -Wshadow -Winit-self -Wredundant-decls
-Wcast-align -Wfloat-equal -Wunreachable-code -Wmissing-include-dirs
-pedantic-errors -pedantic -Wall -std=c++14 -fexceptions -O2 -std=c++14
-pg -DSFML_STATIC -std=c++14
1 ответ
Эти две функции являются подробностями реализации cos
а также sin
,
Если вы посмотрите на https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/math/cos.def.h#L51, тригонометрические функции сначала проверяют, является ли значение NaN
или бесконечным, прежде чем вычислить фактическое значение. Это причина, почему вы получаете два хита:
- один для самого вычисления
- один для упаковочного кода, чтобы проверить действительные номера.
Вы можете рассматривать внутренние функции как вызовы cos / sin. Они могут не отображать тот факт, что они вызываются из sin / cos, в зависимости от сгенерированной отладочной информации, а также от уровня оптимизации.