Muva nje kukhishwe isiphakamiso se-Linux kernel, lapho kuhlongozwa khona ukuthi kufakwe isethi yamapeshi ane a ukuqaliswa okulungiselelwe komsebenzi we-memchr() esetshenziselwa ukusesha uhlamvu ohlwini.
Umsebenzi we-memchr() uskena amabhayithi angu-n aholayo wendawo yenkumbulo ekhonjwe ngo-s ngesikhathi sokuqala sika-c. Kokubili u-c kanye namabhayithi endaweni yenkumbulo akhonjwe ngu-s kuhunyushwa njengezinhlamvu ezingasayiniwe.
Isiphakamiso uthembisa kube ngokushesha ukuthola umlingisi ngaphakathi kwebhlokhi yememori. Ekuhlolweni konjiniyela, ukusetshenziswa okusha kungashesha cishe ngokuphindwe kane kusesho olukhulu
Ngokungafani nenguqulo yangaphambilini, esebenzise ukuqhathanisa kwe-byte-byte, ukuqaliswa okuhlongozwayo kwakhiwa uma kucatshangelwa ukusetshenziswa okugcwele kwamarejista e-CPU angu-64-bit namabhithi angu-32. Esikhundleni samabhayithi, ukuqhathanisa kwenziwa kusetshenziswa amagama omshini, okuvumela okungenani amabhayithi angu-4 ukuba aqhathaniswe ngesikhathi.
Lolu chungechunge lwamapeshi lwenze "memchr()" lwathuthukisa futhi lwengeza i-macro ye
"memchr_inv()" ukuze yomibili imisebenzi ikwazi ukuyisebenzisela ukukhiqiza i-bitmask.Ukuqaliswa kwangempela kwe-"memchr()" kusekelwe ekuqhathanisweni kwebhayithi,
engasebenzisi ngokugcwele irejista engu-64 noma engu-32 ku-CPU. Sisebenzisa a
ukuqhathanisa ngamagama ukuze okungenani amabhayithi ama-4 aqhathaniswe nokufana
isimo sezulu. I-memchr() elungiselelwe ishesha cishe izikhathi ezi-4 kuneyokuqala
ngamaketanga amade. Ku-Linux Kernel, sithola ukuthi ubude bentambo
okuseshwe ngayo ngu-"memchr()" kufika ku-512 bytes ku-drivers/misc/lkdtm/heap.c.
Lapho usesha ezintanjeni ezinkulu, inguqulo entsha ivele yashesha izikhathi ezi-4 kunendala (isibonelo, kuyunithi yezinhlamvu zezinhlamvu eziyi-1000). Ngamaketanga amancane, ukusebenza kahle kokuqaliswa okusha akubalulekile kangako, kodwa kusephezulu kunenguqulo yokuqala.
Into ethokozisayo ngesiphakamiso esisha ukuthuthukiswa kwamaketanga amakhulu, okuthuthukisa kakhulu izikhathi. Kuhle ukusho ukuthi ku-Linux kernel, usayizi wezintambo ezicutshungulwe ku-memchr() ufinyelela ku-512 bytes. Ezivivinyweni zethu, ukusebenza kuzuza kweyunithi yezinhlamvu engu-512-byte, esimweni lapho uhlamvu losesho isekupheleni kwentambo, ingama-20%.
Kuhle ukusho ukuthi inguqulo yokuqala ye-memchr() isetshenziswa ngendlela yokuqhathanisa ehlakaniphile, engawasebenzisi ngokugcwele amarejista ku-64-bit noma 32-bit CPU.
Sisebenzisa isiqhathaniso samagama aphelele ukuze izinhlamvu eziyisi-8 ziqhathaniswe ngesikhathi esisodwa ku-CPU. Le khodi isuselwe ekusebenziseni kukaDavid Light.
Sakha amafayela amabili ukukala ukusebenza kwefayela lokuqala okuqukethe ngokwesilinganiso izinhlamvu eziyi-10 ngaphambi kohlamvu lwendawo. Ifayela lesibili liqukethe okungenani izinhlamvu eziyi-1000 ngaphambi kwe- uhlamvu oluqondiwe.
Ukusebenzisa kwethu okuthi "memchr()" kuncane kangcono ekuhlolweni kokuqala futhi cishe izikhathi ezi-4 ngokushesha kunokwasekuqaleni ukuqaliswa ekuhlolweni kwesibili.
Ukuhlolwa kwe-Kernel 5.18 ngokuhlukile okusha kwe-"memchr()" ye-32-bit kanye ne-64-bit architectures akazange aveze izinkinga.
Kwenzekani uma u-p engaqondile u-8 (noma u-4 kumabhithi angu-32) aqondanisiwe? Akuwona wonke amaphokophelo asekela imithwalo engaqondani (ephumelelayo), akunjalo?
Ngicabanga ukuthi iyasebenza uma u-p engaqondile u-8 noma u-4 byte. Ake sithi intambo ingamabhayithi ayi-10. I-loop lapha izobheka amabhayithi angu-8 okuqala. Uma uhlamvu okuyiwa kulo likubhayithi yokugcina engu-2, owesibili weluphu uzoyithola. Isebenza kanjena emishinini engu-32-bit.
Inzuzo yokusebenza iyonke ayikalinganiselwa yezinhlelo ezingaphansi ze-kernel lapho kusetshenziswa okuhlukile kwe-"memchr()" okuthuthukisiwe, futhi akukaze kuxoxwe ngokuthi ukukhipha ukusetshenziswa (i-memchr() ikholi yomsebenzi yenzeka izikhathi eziyi-129 kukhodi ye-kernel, okuhlanganisa abashayeli nezinhlelo zamafayela).
Okokugcina Uma unesifiso sokwazi okwengeziwe ngakho, ungabheka imininingwane Kulesi sixhumanisi esilandelayo.