4バイトの値を検索して、一連のバイトを反復処理する必要があります(4バイトはすべて同じです)。データの長さは可変であり、これらのバイトはデータ内のどこにあってもかまいません。私は最初のインスタンスを探しています。このロジックはコードの重要な部分で実行されるため、可能な限り最速の実装を見つけようとしています。
これは、Windowsのx86およびx64でのみ実行されます。
typedef unsigned char Byte;
typedef Byte* BytePtr;
typedef unsigned int UInt32;
typedef UInt32* UInt32Ptr;
const Byte MARKER_BYTE = 0xAA;
const UInt32 MARKER = 0xAAAAAAAA;
UInt32 nDataLength = ...;
BytePtr pData = ...;
BytePtr pEnd = pData + nDataLength - sizeof ( UInt32 );
// Option 1 -------------------------------------------
while ( pData < pEnd )
{
if ( *( (UInt32Ptr) pData ) == MARKER )
{
... // Do something here
break;
}
pData++;
}
// Option 2 -------------------------------------------
while ( pData < pEnd )
{
if ( ( *pData == MARKER_BYTE ) && ( *( (UInt32Ptr) pData ) == MARKER ) )
{
... // Do something here
break;
}
pData++;
}
私Option 2
は速いと思いますが、私の推論が正しいかどうかはわかりません。
Option 1
最初にメモリから4バイトを読み取り、それを4バイトの定数と照合し、見つからない場合は次のバイトにステップして最初からやり直します。メモリからの次の4バイトの準備完了は、すでに読み取られた3バイトとオーバーラップするため、同じバイトを再度フェッチする必要があります。私の4バイトマーカーの前のほとんどのバイトは2回読み取られます。
Option 2
一度に1バイトのみを読み取り、その1バイトが一致する場合は、そのアドレスから4バイトの値全体を読み取ります。このようにして、すべてのバイトが1回だけ読み取られ、一致する4バイトだけが2回読み取られます。
私の推論は正しいですか、それとも私は何かを見落としていますか?
そして、誰かがそれを持ち出す前に、はい、私は本当にこの種の最適化を実行する必要があります。:)
編集:このコードはIntel/AMDベースのコンピューターでのみ実行されることに注意してください。通常のx86/x64コンピューター(デスクトップ/サーバー)が問題やパフォーマンスの低下なしにこれを実行する限り、他のアーキテクチャーがこれを実行できないかどうかは気にしません。
編集2:コンパイラはVC ++ 2008です(それが役立つ場合)。