我希望了解如何在将遗留代码、库代码或示例代码集成到自己的代码库中时,避免重复编写源代码浪费时间并冒错的风险。
举个简单的例子,假设有一个图像处理方案,你可能会明白我的意思。
事实上,在集成代码片段时,像这样的情况并不少见:
随着时间的推移,我已经习惯于做一些事情,比如将不必要的计算移出内部循环,可能会将后缀增量更改为前缀...。
或者,我可以使用指针算术,通过行或列遍历数组。
现在,当我从头开始编写代码时,我会习惯性地应用自己的"优化",但我知道编译器也会做一些事情,比如:
- 将循环内的代码移至循环外部 - 将后缀递增改为前缀 - 我不知道的其他很多内容
需要注意的是,每次以这种方式修改一段可工作、经过测试的代码时,不仅会浪费时间,而且还有可能因为手误等原因引入错误(上述示例是简化的)。我知道"过早优化"以及通过设计更好的算法等其他提高性能的方法,但对于上述情况,我正在创建将用于较大管道类型应用程序中的构建块,在这些应用程序中,我无法预测非功能要求可能是什么,因此我只想让代码尽可能快而紧凑,以在时间限制内完成(我的意思是我花费调整代码的时间)。
那么,我的问题是:我在哪里可以找到"现代"编译器通常支持的优化。我正在使用Visual Studio 2008和2012混合使用,但如果有其他选择,例如英特尔的C/C++编译器,我也很感兴趣。有人可以提供一些见解或指向一个有用的网络链接、书籍或其他参考资料吗?
编辑
为了澄清我的问题:
- 我上面展示的优化只是简单的例子,不是完整的列表。我知道针对这些特定更改进行优化是没有意义的(从性能角度来看),因为编译器会自动执行。 - 我特别寻找关于我正在使用的编译器提供哪些优化的信息。
举个简单的例子,假设有一个图像处理方案,你可能会明白我的意思。
事实上,在集成代码片段时,像这样的情况并不少见:
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;
}
现在,当我从头开始编写代码时,我会习惯性地应用自己的"优化",但我知道编译器也会做一些事情,比如:
- 将循环内的代码移至循环外部 - 将后缀递增改为前缀 - 我不知道的其他很多内容
需要注意的是,每次以这种方式修改一段可工作、经过测试的代码时,不仅会浪费时间,而且还有可能因为手误等原因引入错误(上述示例是简化的)。我知道"过早优化"以及通过设计更好的算法等其他提高性能的方法,但对于上述情况,我正在创建将用于较大管道类型应用程序中的构建块,在这些应用程序中,我无法预测非功能要求可能是什么,因此我只想让代码尽可能快而紧凑,以在时间限制内完成(我的意思是我花费调整代码的时间)。
那么,我的问题是:我在哪里可以找到"现代"编译器通常支持的优化。我正在使用Visual Studio 2008和2012混合使用,但如果有其他选择,例如英特尔的C/C++编译器,我也很感兴趣。有人可以提供一些见解或指向一个有用的网络链接、书籍或其他参考资料吗?
编辑
为了澄清我的问题:
- 我上面展示的优化只是简单的例子,不是完整的列表。我知道针对这些特定更改进行优化是没有意义的(从性能角度来看),因为编译器会自动执行。 - 我特别寻找关于我正在使用的编译器提供哪些优化的信息。