我刚刚测试了一个我正在工作的程序,当我用-g编译它时,我发现它的执行速度提高了3μs(统计上显着的变化)。 这对我来说毫无意义 – 我认为-g标志不应该影响程序执行,即使它做了它也会使它运行得更慢,而不是更快。
谁能告诉我为什么会这样? 它是否改变了程序的执行流程? 我没有使用-O进行编译,因为我需要它完全按照写入执行,但如果-g可以通过更改指令顺序以某种方式使其运行得更快我显然应该使用它。
所以我需要确切知道-g标志对程序的更改。
编辑:我运行的测试越多,t值越大(=差异变得越有统计意义)。 这绝对不是测量误差 – 事情正在发生。
正如其他人所说,调试符号不会改变代码的控制流,除非编译器中存在(不太可能的)错误。
但是,它改变了执行,因为可执行文件变得更大,并且执行的代码在更多页面上更广泛地传播。 您可以预期更多缓存未命中和IO信号。 在多任务环境(甚至Linux / busybox系统就是这样的事情)上,这可能导致稍微不同的调度行为。
另一方面,如你所描述的那样,测量这种微小的时差是一种艺术本身。 您可能处于海森堡环境中,测量会影响执行时间。 您的测量结果可能会显示出统计上显着的偏差,但我会非常小心地将它们解释为这样且这样的选项会使代码更快。
-g标志对实际生成的代码进行0更改。 它的作用是向可执行文件添加调试部分。 这些部分不会在运行时加载,但调试器可以加载它们。 由于可执行文件现在有点不同而且更大 – 您可能会尝试测量否。 在一个版本与另一个版本中发生页面错误的情况下,可执行文件存储在磁盘上的方式会发生变化,但代码没有变化。
如果要查看程序集,请在二进制文件上运行objdump -d并进行比较
我确实质疑3us增加的有效性,可靠地测量3us,至少在通用操作系统上是一项艰巨的任务 – 我希望你运行你的程序几千次(可能是几十万次)来用这个数字来试图消除影响这种测量的所有随机事物。
当我在其中一个子程序上使用-debug和-g标志时,我的代码得到了不同的答案,所以虽然我不知道为什么,是的,它肯定会影响程序的执行。
需要了解更多c/c++开发分享gcc -g调试标志是否影响程序执行?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享gcc -g调试标志是否影响程序执行?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979055.html