У меня есть программа, которая выполняет тяжелые вычисления в одном потоке.Существует отладка и сборка выпуска, оба с идентичными параметрами командной строки, за исключением того, что отладочная версия получает -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.Может кто-нибудь дать мне подсказку или посоветовать, что делать?
Обновление: perf stat показывает некоторые интересные числа:
для версии с символами отладки:
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
Похоже, что в версии выпуска наблюдается большая частота ошибок кэша, хотя все должно работать одинаково.