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

时间:2011-02-03 09:49:26

标签: c debugging gcc execution-time

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

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

所以我需要确切知道-g标志对程序的更改。

编辑:我运行的测试越多,t值越大(=差异变得越有统计意义)。这绝对不是测量误差 - 事情正在发生。

2 个答案:

答案 0 :(得分:10)

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

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

另一方面,如你所描述的那样,衡量这种微小的时差是一种艺术本身。您可能处于海森堡环境中,测量会影响执行时间。您的测量结果可能显示出统计上显着的偏差,但我会非常小心地将它们解释为这样的选项会使代码更快。

答案 1 :(得分:8)

-g标志对实际生成的代码进行0更改。它的作用是为可执行文件添加调试部分。这些部分不会在运行时加载,但调试器可以加载它们。由于可执行文件现在有点不同,它更大 - 你可能会尝试测量no。当一个版本与另一个版本发生页面错误时,可执行文件存储在磁盘上的方式会发生变化,但代码没有变化。

如果要查看程序集,请在二进制文件上运行objdump -d并进行比较

我确实质疑3us增加的有效性,可靠地测量3us,至少在通用操作系统上是一项艰巨的任务 - 我希望你运行你的程序几千次(可能是几十万次)提出这个数字,试图消除影响这种测量的所有随机事物。