gpt4 book ai didi

c++ - 关于 C/C++ 编译器优化,我可以假设什么?

转载 作者:可可西里 更新时间:2023-11-01 17:22:48 25 4
gpt4 key购买 nike

我想知道在将遗留代码、库代码或示例代码集成到我自己的代码库中时,如何通过重新散列源代码来避免浪费我的时间和冒拼写错误的风险。

如果我举一个简单的例子,基于图像处理场景,你可能会明白我的意思。

发现我正在集成这样的代码片段实际上并不罕见:

for (unsigned int y = 0; y < uHeight; y++)
{
for (unsigned int x = 0; x < uWidth; x++)
{
// do something with this pixel ....
uPixel = pPixels[y * uStride + x];
}
}

随着时间的推移,我已经习惯于将不必要的计算移出内循环,并可能将后缀增量更改为前缀......

for (unsigned int y = 0; y < uHeight; ++y)
{
unsigned int uRowOffset = y * uStride;
for (unsigned int x = 0; x < uWidth; ++x)
{
// do something with this pixel ....
uPixel = pPixels[uRowOffset + x];
}
}

或者,我可能会使用指针算法,或者按行......

for (unsigned int y = 0; y < uHeight; ++y)
{
unsigned char *pRow = pPixels + (y * uStride);
for (unsigned int x = 0; x < uWidth; ++x)
{
// do something with this pixel ....
uPixel = pRow[x];
}
}

...或按行和列...所以我最终得到这样的结果

unsigned char *pRow = pPixels;
for (unsigned int y = 0; y < uHeight; ++y)
{
unsigned char *pPixel = pRow;
for (unsigned int x = 0; x < uWidth; ++x)
{
// do something with this pixel ....
uPixel = *pPixel++;
}

// next row
pRow += uStride;
}

现在,当我从头开始编写时,我会习惯性地应用我自己的“优化”,但我知道编译器也会做如下事情:

  • 将代码从内部循环移动到外部循环
  • 将后缀增量更改为前缀
  • 还有很多我不知道的东西

请记住,每次我以这种方式弄乱一段工作的、经过测试的代码时,我不仅花费了自己一些时间,而且还冒着引入错误或其他问题的风险(上述示例已简化)。我知道“过早优化”以及通过设计更好的算法等提高性能的其他方法,但对于上述情况,我正在创建将用于更大流水线类型应用程序的构建 block ,我可以'预测非功能性需求可能是什么,所以我只希望代码在时间限制内尽可能快和紧凑(我指的是我花在调整代码上的时间)。

因此,我的问题是:在哪里可以找到“现代”编译器通常支持哪些编译器优化。我正在混合使用 Visual Studio 2008 和 2012,但我很想知道替代方案是否存在差异,例如英特尔的 C/C++ 编译器。任何人都可以提供一些见解和/或向我指出有用的网络链接、书籍或其他引用资料吗?

编辑
只是为了澄清我的问题

  • 我上面展示的优化是简单的例子,不是完整的列表。我知道进行这些特定更改毫无意义(从性能的角度来看),因为编译器无论如何都会这样做。
  • 我专门寻找有关我正在使用的编译器提供了哪些优化的信息。

最佳答案

我希望您作为示例包含的大部分优化都是浪费时间。一个好的优化编译器应该能够为您完成所有这些工作。

我可以通过实用建议的方式提供三个建议:

  1. 在处理真实数据的真实应用程序的上下文中分析您的代码。如果做不到,请想出一些您认为可以非常接近最终系统的综合测试。
  2. 仅优化您通过分析证明是瓶颈的代码。
  3. 如果您确信一段代码需要优化,不要只是假设将不变表达式分解出循环会提高性能。始终进行基准测试,有选择地查看生成的程序集以获得进一步的洞察力。

以上建议适用于任何优化。然而,最后一点与低级优化特别相关。它们有点像魔法,因为涉及到很多相关的建筑细节:memory hierarchy和带宽,instruction pipelining , branch prediction , 使用SIMD说明等

我认为依赖编译器编写者对目标体系结构的深入了解比试图智胜他们要好。

有时您会通过性能分析发现您需要手动优化一些东西。然而,这些情况将相当罕见,这将使您能够将大量精力花在真正会有所作为的事情上。

与此同时,专注于编写正确且可维护的代码。

关于c++ - 关于 C/C++ 编译器优化,我可以假设什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15584814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com