我正在学习如何使用 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 的第一行是指函数需要执行的总时间,而第二行是指返回语句所需的时间。我有其他函数是返回 s 的同一类的 getter int
,但函数时间和 return 语句时间之间的差异只有大约 0.1 秒,而与我发布的时间一样,时间差是 1.06 秒(其他 getter 是调用次数减少了大约 200 万次,与调用总数相比是很小的)。与其中的一行代码相比,什么可以解释函数调用的更高时间?
值得一提的是,我使用 -g -pg 编译,因为我在逐行模式下使用 gprof。
编辑:其中一个答案建议我查看程序集输出。看不懂,所以发在这里。我已经发布了两个函数调用的汇编代码。第一个是 get_floor(),它相对较快(~.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