レガシーコード、ライブラリコード、またはサンプルコードを自分のコードベースに統合するときに、ソースコードを再ハッシュすることで、時間を無駄にし、タイプミスのリスクを回避する方法を知りたいです。
画像処理のシナリオに基づいた簡単な例を挙げれば、私が何を意味しているのかがわかるかもしれません。
私が次のようなコードスニペットを統合しているのを見つけるのは実際には珍しいことではありません:
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を組み合わせて使用していますが、IntelのC /C++コンパイラなどの代替手段との違いがあるかどうかを知りたいと思います。誰かが洞察を流したり、有用なWebリンク、本、その他の参考資料を教えてくれますか?
私の質問を明確にするためだけに 編集
- 上で示した最適化は単純な例であり、完全なリストではありません。コンパイラがとにかくそれを行うので、これらの特定の変更を行うことは(パフォーマンスの観点から)無意味であることを私は知っています。
- 私は特に、使用しているコンパイラーによってどのような最適化が提供されるかについての情報を探しています。