配置文件优化的C ++ / C代码
我有一些沉重的模板化C ++代码,我正在使用。 我可以在调试模式下使用AMD工具进行编译和配置。 然而,如果没有优化,大部分时间都集中在模板代码和STL上。 通过优化的编译,我知道的所有配置文件工具都会生成垃圾信息。 有没有人知道一个好的方法来分析优化的本地代码
PS1:我正在编写的代码也大量模板化。 大部分时间花在未经优化的代码上都会被优化掉。 我说的是,96-97%的运行时间都是在模板化代码中进行的,没有进行优化。 这将破坏分析的准确性。 是的,我可以更改许多模板代码,或者至少模板代码的哪一部分引入了最大的麻烦,我可以在这些地方做得更好。
你应该专注于你编写的代码,因为这是你可以改变的,在STL上花费的时间是不相关的,只是忽略它,并专注于该代码的调用者。 如果在STL中花费了太多时间,则可能会调用其他一些STL基元而不是当前的基元。
分析未优化的代码不太有趣,但您仍然可以获取一些信息。 如果从代码的某些部分使用的算法完全有缺陷,它甚至会出现在那里。 但是,您应该能够从优化代码中的任何良好的性能分析工具中获得有用的信息。 你准确地使用了哪些工具?为什么要调用他们的输出垃圾?
此外,通常手工编写代码通常很容易,并找出哪些部分是有效的,哪些不是。 这只是在精心挑选的点上调用定时器功能(或者在可能的情况下读取处理器的周期数)的问题。 我通常通过单元测试来做到这一点,以获得可重现的结果,但这些都取决于程序的具体情况。
工具或仪表代码是优化的简单部分。 最难的部分是找到方法在需要的地方获得更快的代码。
“垃圾信息”是什么意思?
性能分析对于优化构建只有真正意义,所以工具的设计与它们一起工作 - 因此,如果您得到毫无意义的结果,可能是由于分析器找不到正确的符号或需要构建构建工具。
例如,在英特尔VTune的情况下,我发现我从采样器得到了不可能的结果,除非我明确告诉它在哪里可以找到我正在调试的可执行文件的PDB。 在仪表版本中,我不得不摆弄这些设置,直到它可靠地将探测器放入函数调用中。
@kriss说
你应该专注于你写的代码,因为这是你可以改变的
这正是我要说的。
我想补充一点,在我看来,首先对未经优化编译的代码进行性能优化比较容易,然后再次启用优化器,原因相同。 如果你能解决的问题是花费时间过多,那么无论编译器做什么,它都会花费过多的时间,并且更容易在没有被加扰的代码中找到它。
我不通过测量时间来寻找这样的代码。 如果多余时间是20%,那么我所做的就是随机暂停几次。 只要我看到可以在2个或更多样本上明显改进的东西,那么我就找到了它。 这是一个古怪的方法,但它不会错过任何东西。 我测量前后的整体时间,看看我节省了多少。 这可以进行多次,直到找不到任何要修复的东西。 (顺便说一句,如果你在Linux上,Zoom是一个更自动的方式来做到这一点。)
然后你可以打开优化器,看看它给了你多少,但是当你看到你做了什么改变时,你可以看到编译器真的没有办法为你做。
链接地址: http://www.djcxy.com/p/7617.html