Neseniai buvo išleistas pasiūlymas dėl Linux branduolio, kuriame siūloma įtraukti pleistrų rinkinį su a optimizuotas funkcijos memchr() įgyvendinimas naudojamas ieškant simbolio masyve.
Funkcija memchr () nuskaito pirmuosius n baitų atminties srityje, į kurią nurodo s pirmą kartą c. Tiek c, tiek baitai atminties srityje, į kuriuos nurodo s, yra interpretuojami kaip nepasirašyti simboliai.
Pasiūlymas žada būk greitesnis norėdami rasti simbolį atminties bloke. Kūrėjų testuose naujasis diegimas gali būti beveik keturis kartus greitesnis atliekant dideles paieškas
Skirtingai nuo ankstesnės versijos, kurioje buvo naudojamas baitas po baito palyginimas, siūlomas įgyvendinimas sukurtas atsižvelgiant į visapusišką 64 bitų ir 32 bitų procesoriaus registrų naudojimą. Vietoj baitų lyginimas atliekamas naudojant mašininius žodžius, todėl vienu metu galima palyginti bent 4 baitus.
Ši pataisų serija optimizavo „memchr()“ ir pridėjo makrokomandą
„memchr_inv()“, kad abi funkcijos galėtų jį naudoti bitų kaukei generuoti.Pradinis „memchr()“ įgyvendinimas pagrįstas baitų palyginimu,
kuri nevisiškai naudoja 64 arba 32 bitų registrą procesoriaus. Įgyvendiname a
palyginimas žodžiais, kad būtų galima palyginti bent 4 baitus su tuo pačiu
oras. Optimizuotas memchr() yra beveik 4 kartus greitesnis nei originalas
ilgoms grandinėms. Linux branduolyje matome, kad eilutės ilgis
Ieškoma pagal "memchr()" yra iki 512 baitų aplanke drivers/misc/lkdtm/heap.c.
Kai ieškote didelėse eilutėse, nauja versija pasirodė esanti apie 4 kartus greitesnė už senąją (pavyzdžiui, 1000 simbolių eilutėms). Mažoms grandinėms naujojo diegimo efektyvumas nėra toks reikšmingas, bet vis tiek didesnis nei pradinės versijos.
Įdomiausias naujojo pasiūlymo dalykas yra didelių tinklų patobulinimas, kuris žymiai pagerina laiką. Verta paminėti, kad „Linux“ branduolyje memchr() apdorotų eilučių dydis siekia 512 baitų. Mūsų bandymuose 512 baitų eilučių našumas padidėja, kai paieškos simbolis yra eilutės gale, tai yra 20%.
Verta paminėti, kad pradinė memchr() versija įdiegta naudojant baitų palyginimo techniką, kuri ne iki galo išnaudoja 64 arba 32 bitų procesoriaus registrus.
Naudojame visų žodžių palyginimą, kad CPU vienu metu būtų galima palyginti 8 simbolius. Šis kodas yra pagrįstas David Light įgyvendinimu.
Sukuriame du failus, kad įvertintume pirmojo failo našumą kuriame yra vidutiniškai 10 simbolių prieš paskirties simbolį. Antrame faile yra bent 1000 simbolių prieš tikslinis personažas.
Mūsų „memchr()“ diegimas yra šiek tiek geriau per pirmąjį bandymą ir beveik 4 kartus greičiau nei originalas įgyvendinimas antrajame bandyme.
Branduolio 5.18 testavimas su nauju "memchr()" variantu 32 bitų ir 64 bitų architektūroms neatskleidė jokių problemų.
Kas atsitiks, jei p nėra 8 (arba 4 32 bitų tiksluose) baitų lygiu? Ne visi tikslai palaiko nesuderintas (efektyvias) apkrovas, tiesa?
Manau, kad tai veikia, jei p nėra išlygintas 8 arba 4 baitais. Tarkime, kad eilutė yra 10 baitų. For kilpa čia ieškos pirmųjų 8 baitų. Jei paskirties simbolis yra paskutiniuose 2 baituose, antrasis ciklas jį suras. Tai taip pat veikia 32 bitų įrenginiuose.
Bendras našumo padidėjimas dar neįvertintas branduolio posistemių, kai naudojamas optimizuotas "memchr()" variantas, taip pat nebuvo aptarta, ar nepaisyti įgyvendinimo (funkcijos memchr() iškvietimas branduolio kode, įskaitant tvarkykles ir failų sistemas, įvyksta 129 kartus).
Pagaliau Jei norite sužinoti daugiau apie tai, galite patikrinti išsamią informaciją Šioje nuorodoje.