文字列から IPv4 アドレスを抽出するための最適なソリューション
はじめに
提供されたコードは、IPv4 アドレスを文字列から取得します。文字列。特定の制約に合わせて最適化されていますが、より高速な方法や代替方法を検討する必要がある場合があります。
ベクトル化ソリューション
スループットを最大化するには、SSE4.1 命令を使用したベクトル化ソリューションをお勧めします。
コードは次のとおりです:
__m128i shuffleTable[65536]; //can be reduced 256x times UINT32 MyGetIP(const char *str) { __m128i input = _mm_lddqu_si128((const __m128i*)str); //"192.167.1.3" ... // Code omitted for brevity return _mm_extract_epi32(prod, 0); }
説明
このソリューションは、バイトを 4 つの 4 バイト ブロックに効率的に再配置する、事前計算されたルックアップ テーブル shuffleTable に依存しています。各ブロックは IP アドレスの一部を表します。このソリューションはスループットに関して高度に最適化されており、1 秒あたり 3 億を超えるアドレスを処理するという驚異的な速度を実現します。
shuffleTable の初期化
shuffleTable ルックアップ テーブルは動的に生成されます。その目的は、再配置のための順列を提供することです。
void MyInit() { ... // Code omitted for brevity }
テストと比較
テストにより、このベクトル化されたソリューションは元のコードよりも大幅に高速であることがわかります:
Time = 0.406 (1556701184) Time = 3.133 (1556701184)
結論
このベクトル化されたソリューションにより、元のコードと比較して速度が大幅に向上します。ベクトル化された命令と事前計算されたルックアップ テーブルを利用して IPv4 アドレス抽出を最適化し、1 秒あたり 3 億を超えるアドレスを処理するスループットを実現します。
以上がSSE4.1 命令は、より高速な IPv4 アドレス抽出のためのベクトル化されたソリューションを提供できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。