c++ - 关于循环中值钳位的优化建议

标签 c++ c++11 assembly c++14 inline-assembly

我有一个紧密的循环,就像 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/

相关文章:

c++ - 如何获取 QNetworkConfiguration UserChoice 对话框?

assembly - 了解程序集堆栈操作

c++ - 初始化结构体中的数组变量

c++ - fstream 和 ofstream

c++ - 未知的 CMake 命令 "check_language"

c++ - 可以安全地使用复制/移动构造函数来实现复制/移动赋值运算符吗?

c++ - 如何使用 g++ 包含预编译的 .h.gch 头文件

用于获取函数参数数量的 C++ 模板机制,适用于 lambda 和普通函数

assembly - 如何读取这段Rust代码的汇编代码?

assembly - 我应该如何表示要在彩色计算机程序中使用的霍夫曼树?