IPv4 アドレスを文字列から整数に変換するより速い方法はありますか?

Patricia Arquette
リリース: 2024-11-17 07:35:04
オリジナル
534 人が閲覧しました

Is There a Faster Way to Convert IPv4 Addresses from Strings to Integers?

文字列から IPv4 アドレスを変換するための効率的な代替手段

Q: 文字列からの IPv4 アドレス解析速度の向上

文字列から IPv4 アドレスを解析するための既存のソリューションは、遅く、スループットが制限されます。より高速な方法または実行可能な代替方法はありますか?

A: SSE4.1 によるベクトル化されたソリューション

概要

解析パフォーマンスを最大化するために、SSE4.1 命令を活用したベクトル化ソリューションは大幅な速度を実現します。利点:

コード

__m128i shuffleTable[65536];    //can be reduced 256x times, see @IwillnotexistIdonotexist

UINT32 MyGetIP(const char *str) {
    __m128i input = _mm_lddqu_si128((const __m128i*)str);   //"192.167.1.3"
    input = _mm_sub_epi8(input, _mm_set1_epi8('0'));        //1 9 2 254 1 6 7 254 1 254 3 208 245 0 8 40 
    __m128i cmp = input;                                    //...X...X.X.XX...  (signs)
    UINT32 mask = _mm_movemask_epi8(cmp);                   //6792 - magic index
    __m128i shuf = shuffleTable[mask];                      //10 -1 -1 -1 8 -1 -1 -1 6 5 4 -1 2 1 0 -1 
    __m128i arr = _mm_shuffle_epi8(input, shuf);            //3 0 0 0 | 1 0 0 0 | 7 6 1 0 | 2 9 1 0 
    __m128i coeffs = _mm_set_epi8(0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1);
    __m128i prod = _mm_maddubs_epi16(coeffs, arr);          //3 0 | 1 0 | 67 100 | 92 100 
    prod = _mm_hadd_epi16(prod, prod);                      //3 | 1 | 167 | 192 | ? | ? | ? | ?
    __m128i imm = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 4, 2, 0);
    prod = _mm_shuffle_epi8(prod, imm);                     //3 1 167 192 0 0 0 0 0 0 0 0 0 0 0 0
    return _mm_extract_epi32(prod, 0);
//  return (UINT32(_mm_extract_epi16(prod, 1)) << 16) + UINT32(_mm_extract_epi16(prod, 0)); //no SSE 4.1
}
ログイン後にコピー

利点:

  • 元のコードより 7.8 倍高速です。
  • 毎秒 3 億を超えるアドレスを処理 (シングルコア、 3.4 GHz)。
  • スループットを最大化するためにベクトル化された命令を活用します。

追加メモ:

  • shuffleTable には事前計算が必要です。
  • によるコードの変更@IwillnotexistIdonotexist は、パフォーマンスをわずかに犠牲にして shuffleTable のサイズを 4Kb に削減します。

以上がIPv4 アドレスを文字列から整数に変換するより速い方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート