Я учусь профилировать свой код с помощью gprof. Для одного из моих приложений у меня есть следующий результат:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
10.27 1.20 1.20 Location::get_type() const (location.cpp:20 @ 40a4bd)
Дальше я вижу это
1.20 4.98 0.14 34662692 0.00 0.00 Location::get_type() const (location.cpp:19 @ 40a4ac)
Вот функция
char Location::get_type() const {
return type;
}
Я предполагаю, что первая строка gprof относится к общему времени, которое требуется функции для выполнения, а вторая строка относится только к времени, необходимому для оператора return. У меня есть другие функции, которые являются геттерами для того же класса, которые возвращают int
s, но разница между временем функции и временем оператора возврата составляет всего около 0,1 секунды, тогда как, как и в случаях, когда я опубликовал, разница во времени составляет 1,06 секунды (другие геттеры - звонили примерно в 2 миллиона раз меньше, что мало по сравнению с общим количеством звонков). Чем объясняется большее время вызова функции по сравнению с одной строкой кода в ней?
Возможно, стоит упомянуть, что я компилировал с -g -pg, поскольку я использую gprof в построчном режиме.
Изменить: один из ответов предложил мне посмотреть на вывод сборки. Я не могу этого понять, поэтому выложу здесь. Я разместил ассемблерный код для двух вызовов функций. Первый - get_floor (), относительно быстро (~ 0,10 секунды). Второй - get_type (), который работает медленно.
_ZNK8Location9get_floorEv:
.LFB5:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movl 8(%rax), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE5:
.size _ZNK8Location9get_floorEv, .-_ZNK8Location9get_floorEv
.align 2
.globl _ZNK8Location8get_typeEv
.type _ZNK8Location8get_typeEv, @function
_ZNK8Location8get_typeEv:
.LFB6:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movzbl 12(%rax), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
gprof
. Учитель рекомендовал это? Рекомендовали ли это блог, книгу или какую-то документацию? Имеет ряд проблем. - person Mike Dunlavey   schedule 28.09.2012