Predlagali so, da se v jedro Linuxa vključi do 4-krat hitrejša implementacija memchr

Pred kratkim izdan je bil predlog za jedro Linuxa, v katerega je predlagana vključitev nabora popravkov z a optimizirana izvedba funkcije memchr(). uporablja se za iskanje znaka v nizu.

Funkcija memchr() skenira prvih n bajtov pomnilniškega območja, na katerega kaže s, za prvo instanco c. Tako c kot bajti v pomnilniškem območju, na katerega kaže s, se interpretirajo kot nepredpisani znaki.

Predlog obljube biti hitrejši za iskanje znaka v bloku pomnilnika. V preizkusih za razvijalce je lahko nova implementacija skoraj štirikrat hitrejša pri velikih iskanjih

Za razliko od prejšnje različice, ki je uporabljala primerjavo bajt za bajtom, je predlagana izvedba ustvarjena ob upoštevanju polne uporabe 64-bitnih in 32-bitnih registrov CPU. Namesto bajtov se primerjava izvaja s strojnimi besedami, kar omogoča primerjavo vsaj 4 bajtov naenkrat.

Ta serija popravkov je optimizirala "memchr()" in dodala makro za
"memchr_inv()", tako da ga lahko obe funkciji uporabita za ustvarjanje bitne maske.

Prvotna izvedba "memchr()" temelji na primerjavi bajtov,
ki ne uporablja v celoti 64 ali 32 bitnega registra v CPE. Izvajamo a
primerjava po besedah, tako da lahko vsaj 4 bajte primerjamo z istim
vreme. Optimizirani memchr() je skoraj 4-krat hitrejši od izvirnika
za dolge verige. V jedru Linuxa ugotovimo, da je dolžina niza
iskano z "memchr()" je do 512 bajtov v drivers/misc/lkdtm/heap.c.

Pri iskanju po velikih nizih, nova različica se je izkazala za približno 4-krat hitrejšo od stare (na primer za nize 1000 znakov). Pri majhnih verigah učinkovitost nove implementacije ni tako pomembna, vendar je še vedno višja od prvotne različice.

Zanimivost novega predloga je izboljšava za velike verige, ki precej izboljša čase. Omeniti velja, da je v jedru Linuxa velikost nizov, obdelanih v memchr(), doseže 512 bajtov. V naših testih je bilo povečanje zmogljivosti za 512-bajtne nize v situaciji, ko iskalni znak je na koncu niza, je 20 %.

Omeniti velja, da je izvirna različica memchr() implementirana s tehniko primerjave po bajtih, ki ne uporablja v celoti registrov na 64-bitnem ali 32-bitnem CPE-ju.

Uporabljamo primerjavo celih besed, tako da lahko na CPE primerjamo 8 znakov hkrati. Ta koda temelji na izvedbi Davida Lighta.

Ustvarimo dve datoteki za merjenje zmogljivosti prve datoteke ki vsebuje povprečno 10 znakov pred ciljnim znakom. Druga datoteka vsebuje vsaj 1000 znakov pred ciljni znak.

Naša izvedba "memchr()" je rahlo boljši na prvem testu in skoraj 4-krat hitrejši od originala izvajanje v drugem testu.

Testiranje jedra 5.18 z novo različico »memchr()« za 32-bitne in 64-bitne arhitekture ni razkril nobenih težav.

Kaj se zgodi, če p ni 8 (ali 4 pri 32-bitnih ciljih) bajtno poravnan? Vsi cilji ne podpirajo neporavnanih (učinkovitih) obremenitev, kajne?
 Mislim, da deluje, če p ni 8- ali 4-bajtno poravnan. Recimo, da ima niz 10 bajtov. Zanka for bo iskala prvih 8 bajtov. Če je ciljni znak v zadnjih 2 bajtih, ga bo našla druga zanka for. Tako deluje tudi na 32-bitnih strojih.

Splošno povečanje učinkovitosti še ni ocenjeno podsistemov jedra pri uporabi optimizirane različice "memchr()", prav tako se ni razpravljalo o preglasitvi izvedbe (klic funkcije memchr() se pojavi 129-krat v kodi jedra, vključno z gonilniki in datotečnimi sistemi).

Končno Če vas zanima več o tem, lahko preverite podrobnosti V naslednji povezavi.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.