我有一个程序,可以在单个线程中进行一些繁重的计算。有一个调试和发布版本,都具有相同的命令行参数,但调试版本为-gdwarf-2。有趣的是,带有调试符号的版本比没有调试符号的版本运行速度快约10%。
我检查了两个版本的文件,没有发现任何差异的迹象。所有部分(文本,bss,数据)的大小都大致相同。在两种模式下生成的汇编程序看起来都差不多,除了结尾。发行版本以类似以下内容结束:
num_of_entries:
.quad 10000
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.weakref _ZL28__gthrw___pthread_key_createPjPFvPvE,__pthread_key_create
.hidden DW.ref.__gxx_personality_v0
.weak DW.ref.__gxx_personality_v0
.section .data.DW.ref.__gxx_personality_v0,"awG",@progbits,DW.ref.__gxx_personality_v0,comdat
.align 8
.type DW.ref.__gxx_personality_v0, @object
.size DW.ref.__gxx_personality_v0, 8
DW.ref.__gxx_personality_v0:
.quad __gxx_personality_v0
.hidden __dso_handle
.ident "GCC: (GNU) 4.9.4"
.section .note.GNU-stack,"",@progbits
调试版本的内容如下:
num_of_entries:
.quad 10000
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.weakref _ZL28__gthrw___pthread_key_createPjPFvPvE,__pthread_key_create
.text
.Letext0:
.section .text.unlikely
.Letext_cold0:
.file 29 "/common/pkgs/gcc/4.9.4/include/c++/4.9.4/type_traits"
.file 30 "/common/pkgs/gcc/4.9.4/include/c++/4.9.4/bits/cpp_type_traits.h"
...
.file 104 "/common/pkgs/gcc/4.9.4/include/c++/4.9.4/cxxabi.h"
.section .debug_info,"",@progbits
.Ldebug_info0:
.long 0x59e75
.value 0x2
.long .Ldebug_abbrev0
.byte 0x8
.uleb128 0x1
.long .LASF6801
.byte 0x4
.long .LASF6802
.long .LASF6803
.long .Ldebug_ranges0+0x75a0
.quad 0
.quad 0
.long .Ldebug_line0
.uleb128 0x2
.string "std"
.byte 0x36
.byte 0
我正在使用GCC 4.9。有人可以给我提示或建议我做什么吗?
更新: 性能统计显示一些有趣的数字:
具有调试符号的版本:
70,953,691 cache-references
11,332,829 cache-misses # 15.972 % of all cache refs
26,489,515,232 cycles
60,272,811,599 instructions # 2.28 insns per cycle
13,027,834,737 branches
64,798 faults
1 migrations
19 context-switches
7.181574550 seconds time elapsed
对于没有调试符号的版本:
70,256,938 cache-references
11,960,752 cache-misses # 17.024 % of all cache refs
27,858,492,922 cycles
59,522,994,867 instructions # 2.14 insns per cycle
12,779,462,973 branches
65,212 faults
1 migrations
19 context-switches
7.550653346 seconds time elapsed
即使所有版本都可以正常工作,发行版中的缓存未命中率似乎更高。