>  기사  >  백엔드 개발  >  IPv4 주소를 문자열에서 정수로 변환하는 더 빠른 방법이 있습니까?

IPv4 주소를 문자열에서 정수로 변환하는 더 빠른 방법이 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-17 07:35:04535검색

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.4GHz).
  • 최대 처리량을 위해 벡터화된 지침을 활용합니다.

추가 참고 사항:

  • shuffleTable에는 사전 계산이 필요합니다. .
  • 수정된 코드: @IwillnotexistIdonotexist는 약간의 성능 비용을 들여 shuffleTable 크기를 4Kb로 줄입니다.

위 내용은 IPv4 주소를 문자열에서 정수로 변환하는 더 빠른 방법이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.