Программа быстрее при компиляции с -gdwarf-2 - PullRequest
0 голосов
/ 28 января 2019

У меня есть программа, которая выполняет тяжелые вычисления в одном потоке.Существует отладка и сборка выпуска, оба с идентичными параметрами командной строки, за исключением того, что отладочная версия получает -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

Похоже, что в версии выпуска наблюдается большая частота ошибок кэша, хотя все должно работать одинаково.

...