我有一个紧密的循环,就像 Chandler Carruth 在 CPP CON 2017 中展示的那样: https://www.youtube.com/watch?v=2EWejmkKlxs 在此视频的第 25 分钟处,有一个这样的循环:
for (int& i:v)
i = i>255?255:i;
其中 v
是一个 vector 。这与我的程序中使用的代码完全相同,经过分析后证明它需要花费大量时间。
在他的演讲中,Chandler 修改了程序集并加速了循环。我的问题是,实际上,在生产代码中,推荐的优化方法是什么?我们应该在 C++ 代码中使用内联汇编吗?或者像 Chandler 那样,将 C++ 代码编译成汇编,然后优化汇编器?
假设 x86 架构,将非常感谢优化上述 for 循环的示例。
最佳答案
My question is, in practice, in a production code, what is the recommended approach to optimise this? Shall we use inline assembly in c++ code? Or like Chandler did, compile C++ code into assembly then optimise the assembler?
对于生产代码,您需要考虑软件可能会在自动构建系统中编译和链接。
您希望如何将代码更改应用于此类系统中的汇编代码?您可能会应用差异文件,但如果更改了优化(或其他)设置、切换到另一个编译器或...,则可能会中断。
现在剩下两个选项:将整个函数写入汇编文件 (.s) 或在 C++ 代码中包含内联汇编代码——后者可能具有将相关代码保留在同一翻译单元中的优势。
我仍然会让编译器生成汇编代码一次 – 具有可用的最高优化级别。然后,此代码可以作为您手动优化的(已经预先优化的)基础,然后应将其结果作为内联汇编粘贴回 C++ 源文件或放入单独的汇编源文件中。
关于c++ - 关于循环中值钳位的优化建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54218733/