Optimale Lösung zum Extrahieren einer IPv4-Adresse aus einer Zeichenfolge
Einführung
Der bereitgestellte Code ruft eine IPv4-Adresse ab eine Zeichenfolge. Obwohl für bestimmte Einschränkungen optimiert, sind möglicherweise schnellere oder alternative Methoden zu berücksichtigen.
Vektorisierte Lösung
Für maximalen Durchsatz wird eine vektorisierte Lösung mit SSE4.1-Anweisungen empfohlen.
Hier ist das 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); }
Erklärung
Diese Lösung basiert auf einer vorberechneten Nachschlagetabelle, shuffleTable, die Bytes effizient in vier 4-Byte-Blöcke neu anordnet. Jeder Block repräsentiert einen Teil der IP-Adresse. Die Lösung ist stark auf den Durchsatz optimiert und erreicht beeindruckende Geschwindigkeiten von über 300 Millionen verarbeiteten Adressen pro Sekunde.
Initialisierung von shuffleTable
Die ShuffleTable-Nachschlagetabelle wird dynamisch generiert. Sein Zweck besteht darin, eine Permutation für die Neuanordnung bereitzustellen.
void MyInit() { ... // Code omitted for brevity }
Tests und Vergleich
Tests zeigen, dass diese vektorisierte Lösung deutlich schneller ist als der Originalcode:
Time = 0.406 (1556701184) Time = 3.133 (1556701184)
Fazit
Diese vektorisierte Lösung bietet eine erhebliche Geschwindigkeitsverbesserung im Vergleich zum Originalcode. Es nutzt vektorisierte Anweisungen und eine vorberechnete Nachschlagetabelle, um die Extraktion von IPv4-Adressen zu optimieren, was zu einem Durchsatz von über 300 Millionen verarbeiteten Adressen pro Sekunde führt.
Das obige ist der detaillierte Inhalt vonKönnen SSE4.1-Anweisungen eine vektorisierte Lösung für eine schnellere IPv4-Adressextraktion bieten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!