Является ли флаг gcc -g debugging влиять на выполнение программы?

Я только что тестировал программу, над которой работаю, и вижу, что она выполняется на 3 мкс быстрее (статистически значимое изменение) при компиляции с помощью -g. Для меня это не имеет смысла - я думал, что флаг -g не должен влиять на выполнение программы, и даже если бы это произошло, это запустило бы медленнее, а не быстрее.

Может ли кто-нибудь сказать мне, почему это происходит? И изменит ли он поток выполнения программ? Я не компилирую с -O, потому что мне нужно, чтобы он выполнялся точно так же, как и написанный, но если -g может как-то заставить его работать быстрее с изменением порядка команд, я, очевидно, должен его использовать.

Поэтому мне нужно точно знать, какие изменения делает флаг -g в программе.

Изменить: чем больше тестов я запускаю, тем больше значение t становится (= чем статистически значима разница). Это определенно не ошибка измерения - что-то происходит.

Ответ 1

Как говорили другие, отладочные символы не изменят поток управления вашего кода, если только в компиляторе нет (маловероятной) ошибки.

Он меняет исполнение, хотя, поскольку исполняемый файл становится больше, а исполняемый код распространяется более широко на нескольких страницах. Вы можете ожидать больше промахов в кеше и сигналов ввода-вывода. В многозадачной среде (и даже система Linux/busybox - это такая вещь), это может привести к немногому поведению планирования.

С другой стороны, измерение таких крошечных временных разностей, как вы их описываете, является искусством в его собственных правах. Вероятно, вы находитесь в настройке Гейзенберга, где ваши измерения влияют на время выполнения. Ваши измерения могут показывать статистически значимое отклонение, но я был бы очень осторожен в их интерпретации, говоря, что такой-то вариант делает более быстрый код.

Ответ 2

Флаг -g делает 0 изменений в фактическом сгенерированном коде. Что он делает, так это добавить разделы отладки в исполняемый файл. Эти разделы не загружаются во время выполнения, но отладчики могут их загрузить. Поскольку исполняемый файл теперь немного отличается, он больше - вы можете попытаться измерить нет. ошибок страницы, которые происходят с одной версией, и другой, будут изменения в том, как исполняемый файл хранится на диске, но не изменяется код.

Если вы хотите увидеть сборку, запустите objdump -d в своем двоичном файле и сравните

Я действительно сомневаюсь в достоверности увеличения 3us, хотя, надежно измеряя 3us, по крайней мере, на ОС общего назначения сложная задача - надеюсь, что вы запустили свою программу несколько тысяч раз (скорее всего, несколько сотен тысяч раз) чтобы придумать это число, чтобы попытаться устранить все случайные вещи, влияющие на такое измерение.

Ответ 3

Я получаю другой ответ с моим кодом, когда я использую флаги -debug и -g в одной из подпрограмм, поэтому, хотя я не знаю, почему, да, это определенно влияет на выполнение программы.