Для ядра Linux ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memchr, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π΄ΠΎ 4 Ρ€Π°Π· быстрСС

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² состав ядра Linux ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memchr(), примСняСмой для поиска символа Π² массивС. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ старого Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡŒ ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ сравнСниС, прСдлоТСнная рСализация построСна с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ использования 64- ΠΈ 32-разрядных рСгистров CPU. ВмСсто Π±Π°ΠΉΡ‚ΠΎΠ² сравнСниС осущСствляСтся с использованиСм ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… слов, Ρ‡Ρ‚ΠΎ позволяСт Π·Π° Ρ€Π°Π· ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 4 Π±Π°ΠΉΡ‚Π°.

ΠŸΡ€ΠΈ поискС Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… строках Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ оказался быстрСС старого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 4 Ρ€Π°Π·Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для строк Π² 1000 символов). Для строк нСбольшого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, Π½ΠΎ всё Ρ€Π°Π²Π½ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с исходным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. Π’ ядрС Linux Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² memchr() строк достигаСт 512 Π±Π°ΠΉΡ‚. ΠŸΡ€ΠΈΡ€ΠΎΡΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для 512 Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… строк, Π² ситуации, ΠΊΠΎΠ³Π΄Π° искомый символ находится Π² ΠΊΠΎΠ½Ρ†Π΅ строки, составляСт 20%.

ВСстированиС ядра 5.18 с Π½ΠΎΠ²Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ «memchr()» для 32- ΠΈ 64-разрядных Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ Π½Π΅ выявило ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. ΠžΠ±Ρ‰ΠΈΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ подсистСм ядра ΠΏΡ€ΠΈ использовании ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° «memchr()» ΠΏΠΎΠΊΠ° Π½Π΅ оцСнивался, ΠΊΠ°ΠΊ Π½Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ ΠΈ Ρ†Π΅Π»Π΅ΡΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π² ΠΊΠΎΠ΄Π΅ ядра Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memchr() встрСчаСтся 129 Ρ€Π°Π·, Π² Ρ‚ΠΎΠΌ числС Π² ΠΊΠΎΠ΄Π΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru