c - gcc -g 调试标志是否影响程序执行?

标签 c debugging gcc execution-time

我刚刚测试了一个正在运行的程序,当我使用 -g 编译它时,我发现它的执行速度快了 3 微秒(统计上显着的变化)。这对我来说毫无意义 - 我认为 -g 标志不应该影响程序执行,即使它影响了它也会使它运行得更慢,而不是更快。

谁能告诉我为什么会这样?它是否改变了程序执行流程?我没有使用 -O 进行编译,因为我需要它完全按照编写的方式执行,但是如果 -g 可以通过更改指令顺序以某种方式使其运行得更快,我显然应该使用它。

所以我需要确切地知道 -g 标志对程序做了什么改变。

编辑:我运行的测试越多,t 值就越大(= 差异在统计上越显着)。这绝对不是测量错误 - 有些事情正在发生。

最佳答案

正如其他人所说,除非编译器中存在(不太可能的)错误,否则调试符号不会更改代码的控制流。

但是,它改变了执行,因为可执行文件变得更大,并且执行的代码在更多页面上分布得更广泛。您可以期待更多的缓存未命中和 IO 信号。在多任务环境中(甚至 Linux/busybox 系统也是如此),这可能导致调度行为略有不同。

另一方面,像您描述的那样测量如此微小的时间差异本身就是一门艺术。您可能处于海森堡设置中,您的测量结果会影响执行时间。您的测量结果可能显示出统计上的显着偏差,但我会非常小心地将它们解释为说这样那样的选项可以加快代码速度。

关于c - gcc -g 调试标志是否影响程序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884535/

相关文章:

xcode - 在 GCC 中抑制 "does not implement protocol"警告

c - beanstalkd C 客户端库

windows - 函数 Hook 实际上是如何工作的? WinAPI, C++

Android Studio App only Debug模式

gcc - 如何强制gcc使用所有SSE(或AVX)寄存器?

c++ - 如何编写支持 LTO 的代码?

c - 宏观协议(protocol)中的错误、分歧

c - 如何根据其他数组的数量对数组进行排序?

c - IPC 在 C : Error in receiving 中使用消息队列

c# - visual studio 2010 - 使用 "release"web.config 转换进行调试?