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

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

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

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

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

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

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

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

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

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

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

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