Penyelesaian Optimum untuk Mengeluarkan Alamat IPv4 daripada String
Pengenalan
Kod yang disediakan mendapatkan semula alamat IPv4 daripada seutas tali. Walaupun dioptimumkan untuk kekangan tertentu, mungkin terdapat kaedah yang lebih pantas atau alternatif untuk dipertimbangkan.
Penyelesaian Vektor
Untuk daya pemprosesan maksimum, penyelesaian tervektor menggunakan arahan SSE4.1 disyorkan.
Ini kodnya:
__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); }
Penjelasan
Penyelesaian ini bergantung pada jadual carian prakiraan, shuffleTable, yang menyusun semula bait dengan cekap kepada empat blok 4-bait. Setiap blok mewakili sebahagian daripada alamat IP. Penyelesaian ini sangat dioptimumkan untuk pemprosesan dan mencapai kelajuan mengagumkan melebihi 300 juta alamat yang diproses sesaat.
Pemulaan shuffleTable
Jadual carian shuffleTable dijana secara dinamik. Tujuannya adalah untuk menyediakan pilih atur untuk penyusunan semula.
void MyInit() { ... // Code omitted for brevity }
Pengujian dan Perbandingan
Pengujian menunjukkan bahawa penyelesaian bervektor ini jauh lebih pantas daripada kod asal:
Time = 0.406 (1556701184) Time = 3.133 (1556701184)
Kesimpulan
Penyelesaian vektor ini memberikan peningkatan kelajuan yang ketara berbanding kod asal. Ia memanfaatkan arahan bervektor dan jadual carian prakiraan untuk mengoptimumkan pengekstrakan alamat IPv4, menghasilkan daya pemprosesan lebih 300 juta alamat diproses sesaat.
Atas ialah kandungan terperinci Bolehkah Arahan SSE4.1 Menyediakan Penyelesaian Vektor untuk Pengekstrakan Alamat IPv4 yang Lebih Pantas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!