从字符串中提取 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); }
说明
此解决方案依赖于预先计算的查找表 shuffleTable,它可以有效地将字节重新排列为四个 4 字节块。每个块代表 IP 地址的一部分。该解决方案针对吞吐量进行了高度优化,实现了每秒处理超过 3 亿个地址的惊人速度。
shuffleTable 初始化
shuffleTable 查找表是动态生成的。其目的是提供重新排列的排列。
void MyInit() { ... // Code omitted for brevity }
测试和比较
测试表明这个矢量化解决方案比原始代码要快得多:
Time = 0.406 (1556701184) Time = 3.133 (1556701184)
结论
与原始代码相比,此矢量化解决方案提供了显着的速度改进。它利用矢量化指令和预先计算的查找表来优化 IPv4 地址提取,从而实现每秒处理超过 3 亿个地址的吞吐量。
以上是SSE4.1指令能否提供矢量化解决方案以实现更快的IPv4地址提取?的详细内容。更多信息请关注PHP中文网其他相关文章!