Maison >développement back-end >C++ >Les instructions SSE4.1 peuvent-elles fournir une solution vectorisée pour une extraction plus rapide des adresses IPv4 ?
Solution optimale pour extraire l'adresse IPv4 d'une chaîne
Introduction
Le code fourni récupère une adresse IPv4 de une chaîne. Bien qu'optimisées pour certaines contraintes, il peut y avoir des méthodes plus rapides ou alternatives à envisager.
Solution vectorisée
Pour un débit maximal, une solution vectorisée utilisant les instructions SSE4.1 est recommandée.
Voici le code :
__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); }
Explication
Cette solution repose sur une table de recherche précalculée, shuffleTable, qui réorganise efficacement les octets en quatre blocs de 4 octets. Chaque bloc représente une partie de l'adresse IP. La solution est hautement optimisée pour le débit et atteint des vitesses impressionnantes de plus de 300 millions d'adresses traitées par seconde.
Initialisation de shuffleTable
La table de recherche shuffleTable est générée dynamiquement. Son objectif est de fournir une permutation pour le réarrangement.
void MyInit() { ... // Code omitted for brevity }
Tests et comparaison
Les tests montrent que cette solution vectorisée est nettement plus rapide que le code original :
Time = 0.406 (1556701184) Time = 3.133 (1556701184)
Conclusion
Cette solution vectorisée apporte une amélioration substantielle de la vitesse par rapport à l'originale code. Il exploite des instructions vectorisées et une table de recherche précalculée pour optimiser l'extraction d'adresses IPv4, ce qui entraîne un débit de plus de 300 millions d'adresses traitées par seconde.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!