Kliffs Kliks ā CTO uzÅÄmumÄ Cratus (IoT sensori procesu uzlaboÅ”anai), dibinÄtÄjs un lÄ«dzdibinÄtÄjs vairÄkiem start-up uzÅÄmumiem (ieskaitot Rocket Realtime School, Neurensic un H2O.ai) ar vairÄkiem veiksmÄ«giem izieÅ”anas darÄ«jumiem. Kliffs uzrakstÄ«ja savu pirmo kompilatoru 15 gadu vecumÄ (Pascal priekÅ” TRS Z-80)! ViÅÅ” ir vislabÄk pazÄ«stams ar darbu pie C2 valodas Java (the Sea of Nodes IR). Å is kompilators parÄdÄ«ja pasaulei, ka JIT var ražot kvalitatÄ«vu kodu, kas kļuva par vienu no faktoriem, kÄpÄc Java ir viena no galvenajÄm mÅ«sdienu programmatÅ«ras platformÄm. PÄc tam Kliffs palÄ«dzÄja uzÅÄmumam Azul Systems uzbÅ«vÄt 864 kodolu galveno datoru ar programmatÅ«ru tÄ«rÄ Java, kas atbalstÄ«ja GC pauzes 500 gigabaitu heapÄ 10 milisekundÄs. PatiesÄ«bÄ Kliffs ir strÄdÄjis visos JVM aspektos.
Ā
Å is habraposts ir liels intervija ar Kliffu. MÄs runÄsim par Å”ÄdÄm tÄmÄm:
- PÄrslÄgÅ”anÄs uz zemo lÄ«meÅu optimizÄcijÄm
- KÄ veikt lielu refaktorizÄciju
- Izmaksu modelis
- MÄcÄ«bas par zemo lÄ«meÅu optimizÄcijÄm
- Praktiski piemÄri veiktspÄjas uzlaboÅ”anai
- KÄpÄc radÄ«t savu programmÄÅ”anas valodu
- VeiktspÄjas inženiera karjera
- Tehniskie izaicinÄjumi
- Nedaudz par reģistru pieŔķirŔanu un daudzprocesoru skaitļoŔanu
- LielÄkais izaicinÄjums dzÄ«vÄ
Interviju vada:
- Andrej SatÄrin no Amazon Web Services. SavÄ karjerÄ ir paspÄjis strÄdÄt dažÄdos projektos: testÄjis izplatÄ«tu NewSQL datubÄzi Yandex, mÄkoÅdetectÄÅ”anas sistÄmu Kaspersky laboratorijÄ, daudzu spÄlÄtÄju spÄli Mail.ru un valÅ«tas cenu aprÄÄ·ina servisu Deutsche Bank. InteresÄjas par plaÅ”u aizmugurÄ esoÅ”o un izplatÄ«to sistÄmu testÄÅ”anu.
- Vladimirs SitÅikovs no Netcracker. Desmit gadus strÄdÄ pie veiktspÄjas un mÄrogotspÄjas NetCracker OS ā programmatÅ«ra, ko lieto sakaru operatori tÄ«klu pÄrvaldÄ«bas un tÄ«kla aprÄ«kojuma automatizÄcijas procesu automatizÄÅ”anai. InteresÄjas par Java un Oracle Database veiktspÄju. VairÄk nekÄ desmit veiktspÄjas uzlabojumu autors oficiÄlajam PostgreSQL JDBC draiverim.
PÄrslÄgÅ”anÄs uz zemo lÄ«meÅu optimizÄcijÄm
Andrej: JÅ«s esat pazÄ«stams cilvÄks JIT kompilÄcijas, Java un veiktspÄjas jomÄ kopumÄ, vai ne?Ā
Kliffs: TieÅ”i tÄ!
Andrej: SÄksim ar vispÄrÄ«giem jautÄjumiem par veiktspÄjas uzlaboÅ”anu. Ko jÅ«s domÄjat par izvÄli starp augsta lÄ«meÅa un zemo lÄ«meÅu optimizÄcijÄm, piemÄram, darbu pie CPU lÄ«meÅa?
Kliffs: Å eit viss ir vienkÄrÅ”i. ÄtrÄkais kods ir tas, kuru nekad nesÄk. TÄpÄc vienmÄr jÄsÄk no augsta lÄ«meÅa un jÄstrÄdÄ pie algoritmiem. LabÄka O-notÄcija uzvarÄs sliktÄku O-notÄciju, izÅemot gadÄ«jumus, ja iejaucas pietiekami lieli koeficienti. Zema lÄ«meÅa lietas tiek apskatÄ«tas paÅ”Äs beigÄs. Parasti, ja esat pietiekami labi optimizÄjis visu pÄrÄjo steku un joprojÄm ir kaut kas interesants, tad tas arÄ« ir zems lÄ«menis. Bet kÄ sÄkt no augsta lÄ«meÅa? KÄ zinÄt, ka augstÄ lÄ«meÅa darbÄ ir paveikts pietiekami daudz? Nu... nav nekÄdu gatavu recepÅ”u. JÄizpÄta problÄma, jÄnoskaidro, ko grasies darÄ«t (lai neveiktu nevajadzÄ«gus nÄkamos soļus), un tad var sÄkt izmantot profileru, kas var pateikt kaut ko noderÄ«gu. KÄdÄ brÄ«dÄ« jÅ«s paÅ”i saprotat, ka esat atbrÄ«voties no nevajadzÄ«gÄm lietÄm un pienÄkusi laiks pievÄrst uzmanÄ«bu zema lÄ«meÅa optimizÄcijai. Tas noteikti ir Ä«paÅ”a veida mÄksla. Daudzi cilvÄki dara nevajadzÄ«gas lietas, bet kustas tik Ätri, ka par sniegumu viÅiem nav laika domÄt. Bet tÄ ir, lÄ«dz brÄ«dim, kad jautÄjums kļūst kritisks. Parasti 99% laika nevienam nav interese, ko es daru, lÄ«dz kritiskÄs ceÄ¼Ä neparÄdÄs kÄda svarÄ«ga lieta, kas kÄdam interesÄ. Un tieÅ”i tad visi sÄk par tevi prasÄ«t, ākÄpÄc tas no paÅ”a sÄkuma nedarbojÄs ideÄliā. KopumÄ vienmÄr ir kas jÄuzlabo sniegumÄ. Bet 99% laika tev nav pavedienu! Tu vienkÄrÅ”i mÄÄ£ini panÄkt, lai kaut kas strÄdÄtu, un Ŕī procesa laikÄ saproti, kas ir svarÄ«gi. Nekad nav iespÄjams iepriekÅ” zinÄt, ka tieÅ”i Å”is fragments ir jÄizveido ideÄls, tÄpÄc bÅ«tÄ«bÄ jÄcenÅ”as bÅ«t ideÄlam visÄ. Bet tas nav iespÄjams un tÄ tu nedari. VienmÄr ir daudz lietu, kas jÄremontÄ ā un tas ir pilnÄ«gi normÄli.
KÄ veikt lielu refaktorizÄciju
Andrej: KÄ jÅ«s strÄdÄjat pie snieguma? Tas ir universÄls jautÄjums. PiemÄram, vai jums ir nÄcies strÄdÄt pie problÄmÄm, kas rodas no daudzu jau esoÅ”o funkcionalitÄtes savietojuma?
Kliffs: Es cenÅ”os to izvairÄ«ties. Ja es zinu, ka veiktspÄja kļūs par problÄmu, es par to domÄju vÄl pirms kodÄÅ”anas uzsÄkÅ”anas, it Ä«paÅ”i par datu struktÅ«rÄm. Bet bieži vien tu to atklÄj tikai daudz vÄlÄk. Un tad ir jÄiet uz ekstrÄmiem pasÄkumiem un jÄdara tas, ko es saucu par 'pÄrprogrammÄÅ”anu un pÄrvaldīŔanu': jÄÅem pietiekami liels gabals. KÄda daļa koda tÄpat jÄpÄrprogrammÄ sakarÄ ar veiktspÄjas problÄmÄm vai kÄdu citu iemeslu. KÄds jebkurÅ” koda pÄrprogrammÄÅ”anas iemesls var bÅ«t ā gandrÄ«z vienmÄr ir labÄk pÄrprogrammÄt lielÄku gabalu nekÄ mazÄku. TajÄ brÄ«dÄ« visi sÄk drebÄt no bailÄm: 'Ak Dievs, nevar taÄu izmainÄ«t tik daudz koda!'. Bet, patiesÄ«bÄ, Å”Äds pieejas veids gandrÄ«z vienmÄr darbojas daudz labÄk. JÄÄ·eras pie lielas problÄmas uzreiz, jÄizveido liels aplis ap to un jÄsaka: viss, kas ir iekÅ”Ä aplÄ«, es to pÄrprogrammÄÅ”u. Robeža taÄu ir daudz mazÄka par to saturu iekÅ”Ä, kuru nepiecieÅ”ams nomainÄ«t. Un, ja Å”Äds robežas noteikums ļaus perfekti paveikt iekÅ”ÄjÄs darbu ā tev ir brÄ«vas rokas, dari ko vÄlies. TiklÄ«dz tu saproti problÄmu, pÄrprogrammÄÅ”anas process norit daudz vieglÄk, tÄpÄc Åem lielu gabalu!
TajÄ paÅ”Ä laikÄ, kad tu pÄrprogrammÄ lielu gabalu un apzini, ka veiktspÄja kļūs par problÄmu, vari uzreiz sÄkt par to uztraukties. Parasti tas pÄrvÄrÅ”as vienkÄrÅ”Äs lietÄs, piemÄram, 'nepÄrvietojiet datus, pÄrvaldiet datus pÄc iespÄjas vienkÄrÅ”Äk, padariet tos mazÄkus'. LielÄs pÄrprogrammÄÅ”anÄs gadÄ«jumos ir standartveida veidi, kÄ uzlabot veiktspÄju. Un tie gandrÄ«z vienmÄr ir saistÄ«ti ar datiem.
Izmaksu modelis
Andrej: VienÄ no podkÄstiem jÅ«s runÄjÄt par cenu modeļiem veiktspÄjas kontekstÄ. Vai varÄtu paskaidrot, ko jÅ«s ar to domÄjÄt?
Kliffs: Protams. Es piedzimstÄ«ju laikmetÄ, kad procesoru veiktspÄja bija ÄrkÄrtÄ«gi svarÄ«ga. Un Ŕī Ära atkal atgriežas ā liktenis neizbÄgami ironizÄ. Es sÄku dzÄ«vot astoÅbitu maŔīnu laikmetÄ, mans pirmais dators darbojÄs ar 256 baitiem. TieÅ”Äm, ar baitiem. Viss bija ļoti neliels. Bija jÄskaita instrukcijas, un tiklÄ«dz sÄkÄm virzÄ«ties augstÄk programmÄÅ”anas valodu stekÄ, valodas uzÅÄma aizvien vairÄk un vairÄk. Bija Assembler, tad Basic, tad C, un C uzÅÄma darbu ar daudzÄm detaļÄm, piemÄram, reÄ£istru sadali un instrukciju plÄnoÅ”anu. Bet tur viss bija diezgan skaidrs, un, ja es izveidoju rÄdÄ«tÄju uz mainÄ«gÄ instanci, es saÅemÅ”u load, un Å”ai instrukcijai izmaksas ir zinÄmas. Dzelži sniedz zinÄmu skaitu maŔīnu ciklu, tÄpÄc dažÄdu uzdevumu izpildes Ätrumu var aprÄÄ·inÄt, vienkÄrÅ”i summÄjot visas instrukcijas, kuras tu plÄno palaist. Katru compare/test/branch/call/load/store varÄjÄm saskaitÄ«t un teikt: lÅ«k, te ir izpildes laiks. NodarbÄjoties ar veiktspÄjas uzlaboÅ”anu, tu noteikti pievÄrsÄ«si uzmanÄ«bu tam, kÄdi skaitļi atbilst mazÄm karstÄm ciklu reakcijÄm.Ā
Bet tiklÄ«dz tu pÄriet uz Java, Python un tamlÄ«dzÄ«gÄm lietÄm, tu ļoti Ätri attÄlinies no zemo lÄ«meÅu dzelžiem. KÄda ir getters izsaukuma izmaksas Java? Ja JIT HotSpotÄ viss ir pareizi , tas bÅ«s load, bet, ja viÅÅ” to nav izdarÄ«jis ā tas bÅ«s funkcijas izsaukums. TÄ kÄ izsaukums atrodas karstajÄ ciklÄ, tas atcels visas pÄrÄjÄs optimizÄcijas Å”ajÄ ciklÄ. TÄpÄc reÄlÄ cena bÅ«s daudz lielÄka. Un tu uzreiz zaudÄ spÄju skatÄ«ties uz koda fragmentu un saprast, kÄdÄļ mums to vÄrts veikt attiecÄ«bÄ uz procesora takts frekvenci, izmantoto atmiÅu un keÅ”atmiÅu. Viss tas kļūst interesants tikai tad, ja tieÅ”Äm dziļi iegrims veiktspÄjÄ.
Tagad mÄs esam situÄcijÄ, kad procesoru Ätrumi jau vairÄk nekÄ desmit gadu laikÄ gandrÄ«z nav auguÅ”i. Vecie laiki atgriežas! JÅ«s vairs nevarat paļauties uz labu vienas pavediena veiktspÄju. Bet, ja notiks paralÄlÄs aprÄÄ·ina uzsÄkÅ”ana ā tas ir ÄrkÄrtÄ«gi sarežģīti, visi skatÄs uz jums kÄ uz Džeimsu Bondu. DesmitkÄrtÄ«gas paÄtrinÄÅ”anas parasti notiek tajÄs vietÄs, kur kÄds ir kaut ko izlaidis. ParalÄlismam ir nepiecieÅ”ams daudz darba. Lai sasniegtu Å”o desmitkÄrtÄ«go paÄtrinÄjumu, ir jÄizprot izmaksu modelis. Kas un cik maksÄ. Un, lai to izprastu, jÄsaprot, kÄ valoda tiek uzlikta uz zemÄk esoÅ”Ä dzelzs.
MÄrtins Tompsons savam emuÄram atrada lielisku vÄrdu ! Ir jÄizprot, ko plÄno darÄ«t dzelzs, kÄ tieÅ”i tas to darÄ«s un kÄpÄc tas vispÄr dara to, ko dara. Izmantojot to, ir diezgan vienkÄrÅ”i sÄkt saskaitÄ«t instrukcijas un noskaidrot, kurp iet izpildes laiks. Ja tev nav attiecÄ«gÄs sagatavotÄ«bas, tu vienkÄrÅ”i meklÄ melnu kaÄ·i tumÅ”Ä istabÄ. Es pastÄvÄ«gi redzu cilvÄkus, kas optimizÄ veiktspÄju, kuriem nav ne mazÄkÄs nojausmas, ko lÄga viÅi vispÄr darÄ. ViÅi ļoti cieÅ” un nekur Ä«paÅ”i nevirzÄs uz priekÅ”u. Un, kad es paÅemu to paÅ”u koda gabalu, ielikdams tur pÄris sÄ«ku haku, un iegÅ«stu pieckÄrtÄ«gu vai desmitkÄrtÄ«gu paÄtrinÄjumu, viÅi saka: nu, tas nav godÄ«gi, mÄs arÄ« tÄ zinÄjÄm, ka tu esi labÄks. PÄrsteidzoÅ”i. Par ko es runÄju⦠izmaksu modelis ā tas ir par to, kÄdu kodu tu raksti un cik Ätri tas vidÄji darbojas vispÄrÄjÄ attÄlÄ.
Andrej: Un kÄ tÄdu apjomu noturÄt prÄtÄ? To sasniedz ar lielu pieredzi, vai ne? Kur iegÅ«t tÄdu pieredzi?
Kliffs: Nu, savu pieredzi es ieguvu ne vistuvÄkajÄ ceļÄ. Es programmÄju AssemblerÄ« vÄl tajos laikos, kad varÄja izprast katru atseviŔķu instrukciju. Tas izklausÄs muļķīgi, bet no tÄ laika man prÄtÄ, atmiÅÄ, uz visiem laikiem ir palicis Z80 instrukciju komplekts. Es neatceros cilvÄku vÄrdus jau minÅ«ti pÄc sarunas, bet atceros kodu, kas rakstÄ«ts pirms 40 gadiem. Interesanti, tas izskatÄs kÄ āĀ».
MÄcÄ«bas par zemo lÄ«meÅu optimizÄcijÄm
Andrej: Vai ir kÄds vienkÄrÅ”Äks veids, kÄ iesaistÄ«ties?
Kliffs: JÄ un nÄ. Dzelzs, ko mÄs visi izmantojam, Å”ajÄ laikÄ bÅ«tiski nemainÄ«jÄs. Visi izmanto x86, izÅemot viedtÄlruÅus uz Arm. Ja tu nenodarbojies ar kÄdu hardcore iebÅ«vÄto sistÄmu, tev viss ir tieÅ”i tÄds pats. Labi, tÄlÄk. Instrukcijas arÄ« gadsimtus nav mainÄ«juÅ”Äs. JÄiet un jÄraksta kaut kas par Assembler. Nedaudz, bet pietiekami, lai sÄktu saprast. JÅ«s smaidÄt, bet es pilnÄ«gi nopietni to saku. JÄizprot valodas un dzelža attiecÄ«bas. PÄc tam jÄiet, jÄuzraksta nedaudz un jÄizveido neliels rotaļu kompilers nelielai rotaļu valodai. 'Rotaļu' nozÄ«mÄ, ka jÄizveido to saprÄtÄ«gÄ laikÄ. Tam var bÅ«t supervienkÄrÅ”a struktÅ«ra, bet tam jÄÄ£enerÄ instrukcijas. Instrukciju Ä£enerÄÅ”anas akts ļaus saprast izmaksu modeli tiltam starp augstÄ lÄ«meÅa kodu, ko visi raksta, un maŔīnkodu, kas izpildÄs uz dzelža. Å Ä« attiecÄ«ba paliks prÄtos brÄ«dÄ«, kad rakstÄ«siet kompileri. Pat visvienkÄrÅ”Äkajam kompilerim. PÄc tam var sÄkt skatÄ«ties uz Java un saprast, ka tÄs semantiskÄ kloÄ·ÄÅ”ana ir daudz dziļÄka, un tÄs virsÅ« uzcelt tiltus ir daudz grÅ«tÄk. Java ir daudz grÅ«tÄk saprast, vai mÅ«su tilts ir labs vai slikts, kas to var sabojÄt un kas nÄ. Bet tev ir nepiecieÅ”ama kÄda sÄkumpunkts, kad tu skaties uz kodu un saproti: 'Aha, Å”im getteram katru reizi jÄsaturÄs iekÅ”Ä'. Un tÄlÄk izrÄdÄs, ka dažreiz tÄ arÄ« notiek, izÅemot situÄcijas, kad metode kļūst pÄrÄk liela, un JIT sÄks saturÄt visu kopÄ. Å Ädu vietu veiktspÄju var paredzÄt nekavÄjoties. Parasti getterÄ« darbojas labi, bet pÄc tam tu skaties uz lieliem karstiem cikliem un saproti, ka tur ir kÄdi funkcionÄlie izsaukumi, kas nav skaidrs, ko dara. Å eit ir problÄma ar plaÅ”u getteru lietoÅ”anu, iemesls, kÄpÄc tie neiekļaujas - nav skaidrs, vai tas ir getters. Ja tev ir supermaza kodu bÄze, to var vienkÄrÅ”i iegaumÄt un pÄc tam teikt: Å”is ir getters, bet Å”is ir setters. LielÄ kodu bÄzÄ katrai funkcionÄlijai ir sava stÄsts, kas nevienam, bÅ«tÄ«bÄ, nav zinÄms. Profileris saka, ka mÄs zaudÄjuÅ”i 24% laika kaut kÄdÄ ciklÄ, un lai saprastu, ko dara Å”is cikls, jÄskatÄs uz katru funkciju iekÅ”Ä. Nevar to saprast, nepÄtÄ«jot funkciju, un tas nopietni palÄnina izpratnes procesu. TÄpÄc es neizmantoju getterus un setterus, es esmu sasniedzis jaunu lÄ«meni!
KÄ iegÅ«t izmaksu modeli? Protams, var palasÄ«t kaut ko... Bet es domÄju, labÄkais veids ir rÄ«koties. Izveidot mazu kompilatoru, un tas bÅ«s labÄkais veids, kÄ apzinÄt izmaksu modeli un iekļaut to savÄ prÄtÄ. Mazs kompilators, kas derÄtu mikroviļÅu krÄsns programmÄÅ”anai ā tas ir uzdevums iesÄcÄjiem. Nu, es domÄju, ja tev jau ir programmÄÅ”anas prasmes, tad tÄs pietiks. Visas tÄs lietas, piemÄram, izparsinÄt rindu, kas bÅ«s kÄds algebriskais izteikums, izvilkt no tÄs matemÄtisko operÄciju instrukcijas pareizajÄ secÄ«bÄ, iegÅ«t pareizÄs vÄrtÄ«bas no reÄ£istriem ā to visu var izdarÄ«t viegli. Un kamÄr tu to darÄ«si, tas ieies prÄtÄ. DomÄju, visi zina, ko dara kompilators. Un tas dos izpratni par izmaksu modeli.
Praktiski piemÄri veiktspÄjas uzlaboÅ”anai
Andrej: Uz ko vÄl jÄpievÄrÅ” uzmanÄ«ba, strÄdÄjot pie veiktspÄjas?
Kliffs: Datu struktÅ«ras. Starp citu, jÄ, jau sen neesmu vadÄ«jis Å”os pasÄkumus⦠. Tas bija interesanti, bet prasÄ«ja tik daudz spÄku, bet man taÄu ir arÄ« dzÄ«ve! Labi. TÄtad, vienÄ no lielajÄm un interesantajÄm nodarbÄ«bÄm, "Kur pazÅ«d jÅ«su veiktspÄja", es devu studentiem piemÄru: divarpus gigabaiti finteh datu tika nolasÄ«ti no CSV faila, un tÄlÄk bija jÄskaita pÄrdoto produktu skaits. Parasti tirgus dati. UDP paketes, kas pÄrvÄrstas teksta formÄtÄ, sÄkot ar 70. gadiem. ÄikÄgas PreÄu birža ā visÄdas lietas kÄ eļļa, kukurÅ«za, sojas pupas un tamlÄ«dzÄ«gi. Bija jÄskaita Å”ie produkti, darÄ«jumu skaits, vidÄjais naudas un preÄu apgrozÄ«jums utt. TÄ ir diezgan vienkÄrÅ”a tirdzniecÄ«bas matemÄtika: atrast produkta kodu (tas ir 1-2 simboli hash tabulÄ), iegÅ«t summu, pievienot to vienam no darÄ«jumu kopumiem, pievienot apjomu, pievienot izmaksas un pÄris citas lietas. Ä»oti vienkÄrÅ”a matemÄtika. RotaļīgÄ realizÄcija bija ļoti vienkÄrÅ”a: viss atrodas failÄ, es lasu failu un pÄrvietojos pa to, sadalot atseviŔķas ierakstu Java rindÄs, meklÄju tajÄs nepiecieÅ”amÄs lietas un sumÄju saskaÅÄ ar iepriekÅ” aprakstÄ«to matemÄtiku. Un tas darbojas ar kÄdu nelielu Ätrumu.
Ar Å”Ädu pieeju viss ir acÄ«mredzams, kas notiek, un paralÄlie aprÄÄ·ini Å”eit nepalÄ«dz, vai ne? IzrÄdÄs, piecu reizes lielÄku veiktspÄju var sasniegt, vienkÄrÅ”i izvÄloties pareizÄs datu struktÅ«ras. Un tas pÄrsteidz pat pieredzÄjuÅ”us programmÄtÄjus! ManÄ konkrÄtajÄ gadÄ«jumÄ uzmanÄ«ba bija pievÄrsta tam, ka nevajadzÄtu veikt atmiÅas rezervÄÅ”anu karstajÄ ciklÄ. Nu, tas nav viss, bet kopumÄ ā nevajadzÄtu veikt rezervÄcijas āreizi Xā, kad X ir pietiekami liels. Kad X ir divi ar pusi gigabaiti, nevajadzÄtu rezervÄt neko āreizi par burtuā, vai āreizi par rindiÅuā, vai āreizi par laukuā, neko tamlÄ«dzÄ«gu. TieÅ”i tajÄ tiek tÄrÄts laiks. KÄ tas vispÄr darbojas? IedomÄjieties, ka veicu izsaukumu String.split() vai BufferedReader.readLine(). Readline izveido virkni no byte kopas, kas nÄk pa tÄ«klu, vienu reizi katrai rindiÅai, katrai no simtiem miljoniem rindiÅu. Es paÅemu Å”o rindu, analizÄju to un izmetu. KÄpÄc izmetu ā nu, es to jau esmu apstrÄdÄjis, viss. TÄtad katram byte, kas nolasÄ«ts no Å”iem 2.7G, tiks ierakstÄ«ti divi simboli virknes, t.i., jau 5.4G, un tie man turpmÄk nav nepiecieÅ”ami, tÄpÄc tie tiek izmestti. Ja paskatÄmies uz atmiÅas caurlaidspÄju, mÄs slodze 2.7G, kas iet cauri atmiÅai un atmiÅas bus, procesoram, un tÄlÄk divreiz vairÄk tiek nosÅ«tÄ«ti uz virkni, kas atrodas atmiÅÄ, un viss tas tiek pÄrstrÄdÄts, veidojot katru jauno virkni. Bet man taÄu ir jÄizlasa tÄ, dzelzs to nolasa, pat ja pÄc tam viss tiks pÄrstrÄdÄts. Un man tas jÄieraksta, jo es izveidoju virkni, un keÅ”i ir pÄrpildÄ«ti ā keÅ”s nevar uzÅemt 2.7G. TÄtad katram nolasÄ«tajam byte es nolasu vÄl divus papildu byte un ierakstu divus papildu byte, un kopumÄ tiem ir attiecÄ«ba 4:1 ā Å”ÄdÄ attiecÄ«bÄ mÄs nevajadzÄ«gi tÄrÄjam atmiÅas caurlaidspÄju. Un tÄlÄk izrÄdÄs, ka, ja es veicu String.split() ā tad es to noteikti nedaru pÄdÄjo reizi, tur iekÅ”Ä var bÅ«t vÄl 6-7 lauki. TÄpÄc klasiskÄ CSV nolasīŔanas un pÄc tam virknÄÅ”anas kods noved pie atmiÅas caurlaidspÄjas zuduma aptuveni 14:1 attiecÄ«bÄ pret to, ko jums faktiski vÄlÄtos. Ja izmetam Ŕīs rezervÄcijas, tad varam sasniegt piecu reizes Ätrumu.
Un tas nav ļoti sarežģīti. Ja jÅ«s paskatÄ«sieties uz kodu no pareizÄ leÅÄ·a, viss kļūst diezgan vienkÄrÅ”i, tiklÄ«dz saprotat problÄmas bÅ«tÄ«bu. Nav vÄrts vispÄr pÄrtraukt atmiÅas sadali: problÄma ir tajÄ, ka jÅ«s kaut ko sadalÄt un tas tÅ«lÄ«t mirst, un pa ceļam iznÄ«cina svarÄ«gu resursu, kas Å”ajÄ gadÄ«jumÄ ir atmiÅas caurlaidÄ«ba. Un viss tas beidzas ar veiktspÄjas kritumu. x86 parasti ir nepiecieÅ”ams aktÄ«vi izmantot procesora taktis, bet Å”eit jÅ«s iztÄrÄjÄt visu atmiÅu daudz agrÄk. RisinÄjums ir samazinÄt sadalÄ«jumu skaitu.Ā
VÄl viena problÄmas daļa ir tÄ, ka, ja jÅ«s palaidÄ«sit profileru brÄ«dÄ«, kad beidzÄs atmiÅas josla, tieÅ”i tajÄ brÄ«dÄ«, kad tas notiek, jÅ«s parasti gaidÄt keÅ”atmiÅas atgrieÅ”anos, jo tÄ ir pilna ar miskasti, ko jÅ«s tikko radÄ«jÄt visiem Å”iem rindÄm. TÄpÄc katra load vai store operÄcija kļūst lÄna, jo tÄs izraisa keÅ”atmiÅas trÅ«kumus - visa keÅ”atmiÅa kļūst lÄna, gaidot, kad no tÄs izvestÄ«s miskasti. TÄpÄc profilers parÄdÄ«s tikai siltus nejauÅ”us trokÅ”Åus, kas izsisti pa visu ciklu - nebÅ«s nekÄdas atseviŔķas karstas instrukcijas vai vietas kodÄ. Tikai troksnis. Un, ja jÅ«s paskatÄ«sieties uz GC cikliem, tie visi bÅ«s Young Generation un supers Ätri - mikroskÄnas vai milisekundes maksimums. Jo visa Ŕī atmiÅa mirst nekavÄjoties. JÅ«s sadalÄt miljardiem gigabaitu, un tas tos nogriež, un nogriež un vÄlreiz nogriež. Viss tas notiek ļoti Ätri. RezultÄtÄ ir lÄti GC cikli, silts troksnis visÄ ciklÄ, bet mÄs vÄlamies iegÅ«t 5-reizes paÄtrinÄjumu. Å ajÄ brÄ«dÄ« kaut kas jÄsakrÄjas galvÄ un jÄskaidrojÄs: "kÄpÄc tÄ?!". AtmiÅas joslas pÄrsniegÅ”ana neparÄdÄs klasiskajÄ debuggÄrÄ«, ir jÄpalaidÄ«s aparatÅ«ras veiktspÄjas skaitÄ«tÄju debuggers un jÄpaskatÄs uz to tieÅ”i. Un, ja ne tieÅ”i, to var aizdomÄties no Å”iem trim simptomiem. TreÅ”ais simptoms - tas ir, kad jÅ«s skatÄties, ko sadalÄt, prasÄt profileram, un viÅÅ” atbild: "JÅ«s izdarÄ«jÄt miljardu rindu, bet GC strÄdÄja par brÄ«vu". TiklÄ«dz tas notiek, jÅ«s saprotat, ka esat radÄ«jis pÄrÄk daudz objektu un iztÄrÄjis visu atmiÅas joslu. Ir veids, kÄ to izprast, bet tas nav acÄ«mredzams.Ā
Datu struktÅ«ras problÄma: tukÅ”a struktÅ«ra, kas slÄpjas aiz visa notiekoÅ”Ä, ir pÄrÄk liela, tÄ aizÅem 2.7G diskÄ, tÄdÄļ Ŕīs lietas kopÄÅ”ana ir ļoti nevÄlama ā vÄlÄtos to ielÄdÄt tieÅ”i no tÄ«kla bajtu bufera reÄ£istros, lai nevajadzÄtu piecas reizes rakstÄ«t un lasÄ«t atpakaļ un uz priekÅ”u. DiemžÄl Java pÄc noklusÄjuma nesniedz tÄdu bibliotÄku savÄ JDK komplektÄ. Bet tas taÄu ir trivÄli, vai ne? PatiesÄ«bÄ tas ir 5-10 koda rindiÅas, kas tiks izmantotas, lai Ä«stenotu savu buferizÄto rindiÅu ielÄdÄtÄju, kas atkÄrto virkÅu klases uzvedÄ«bu, bÅ«tÄ«bÄ kalpojot kÄ apvalks ap zemÄk esoÅ”o bajtu buferi. RezultÄtÄ izrÄdÄs, ka tu strÄdÄ gandrÄ«z it kÄ ar virknÄm, bet patiesÄ«bÄ tur pÄrvietojas rÄdÄ«tÄji uz buferi, un nevis neapstrÄdÄti bajti tiek kopÄti, un tÄdÄjÄdi tiek atkÄrtoti izmantoti tie paÅ”i buferi atkal un atkal, un operÄtÄjsistÄma labprÄt uzÅemas lietas, kam tÄ ir paredzÄta, piemÄram, slÄptu dubulto buferizÄÅ”anu Å”iem bajtu buferiem, un tu vairs neiznÄ«cini bezgalÄ«gu nevajadzÄ«gu datu plÅ«smu. Starp citu, jÅ«s taÄu saprotat, ka strÄdÄjot ar GC garantÄts, ka katra atmiÅas pieŔķirÅ”ana nebÅ«s redzama procesoram pÄc pÄdÄjÄ GC cikla? TÄdÄļ, tas viss nekÄ nevar bÅ«t keÅ”Ä, un tÄlÄk notiek 100%-Ä«gi garantÄts nepareizais trieciens. StrÄdÄjot ar rÄdÄ«tÄju, x86 piekļūŔana reÄ£istram no atmiÅas aizÅem 1-2 takts, un tiklÄ«dz tas notiek, tu maksÄ, maksÄ, maksÄ, jo visa atmiÅa ir ā un tieÅ”i tas ir atmiÅas pieŔķirÅ”anas izmaksas. PatiesÄs izmaksas.
Citiem vÄrdiem sakot, datu struktÅ«ras ir tÄs, ko visgrÅ«tÄk mainÄ«t. Un tiklÄ«dz jÅ«s saprotat, ka esat izvÄlÄjies nepareizu datu struktÅ«ru, kas vÄlÄk sabojÄs veiktspÄju, parasti jÄpavada bÅ«tiska darba apjoms, bet, ja to neizdarÄ«siet, tÄlÄk bÅ«s vÄl sliktÄk. PirmkÄrt, ir jÄdomÄ par datu struktÅ«rÄm, tas ir svarÄ«gi. GalvenÄs izmaksas Å”eit ir saistÄ«tas ar lielÄm datu struktÅ«rÄm, kuras sÄk izmantot stilÄ "es kopÄju datu struktÅ«ru X datu struktÅ«rÄ Y, jo Y man labÄk patÄ«k pÄc formas". Bet kopÄÅ”anas operÄcija (kura Ŕķiet lÄta) patiesÄ«bÄ patÄrÄ atmiÅas joslu, un tieÅ”i Å”eit slÄpjas viss zaudÄtais izpildes laiks. Ja man ir milzÄ«ga JSON rinda un es vÄlos to pÄrvÄrst par strukturÄtu DOM koku no POJO vai kaut kÄ tamlÄ«dzÄ«ga, Ŕīs rindas parsÄÅ”anas operÄcija un POJO veidoÅ”ana, un pÄc tam jauna piekļuve POJO vÄlÄkies radÄ«s nevajadzÄ«gas izmaksas ā tas nav lÄti. Ieskaitot gadÄ«jumus, ja jÅ«s darbosies ar POJO daudz biežÄk nekÄ ar rindu. PirmajÄ brÄ«dÄ« varÄtu izmÄÄ£inÄt izsist rindu un izvilkt tikai nepiecieÅ”amo, nepÄrvÄrÅ”ot to par nekÄdiem POJO. Ja viss tas notiek ceļÄ, kurÄ nepiecieÅ”ama maksimÄla veiktspÄja, nekÄdus POJO ā ir vajaÄ£s tieÅ”i Åemties ar rindu.
KÄpÄc radÄ«t savu programmÄÅ”anas valodu
Andrej: JÅ«s teicÄt, ka, lai apzinÄtos izmaksu modeli, jÄpieraksta sava mazÄ valoda...
Kliffs: Nevis valoda, bet kompilators. Valoda un kompilators ir dažÄdas lietas. GalvenÄ atŔķirÄ«ba ā jÅ«su prÄtÄ.Ā
Andrej: Starp citu, cik zinu, jÅ«s eksperimentÄjat ar savu valodu izveidi. KÄpÄc?
Kliffs: TÄpÄc, ka varu! Es esmu pussezonÄ, tÄpÄc tas ir mans hobijs. Visu mūžu es esmu Ä«stenojis sveÅ”as valodas. Un esmu arÄ« daudz strÄdÄjis pie koda stila. Un vÄl tÄpÄc, ka redzu problÄmas citÄs valodÄs. Redzu, ka ir labÄki veidi, kÄ veikt ierastas lietas. Un es tos izmantotu. Man ir apnikusi redzÄt problÄmas sevÄ«, Java, Python, jebkurÄ citÄ valodÄ. Es Å”obrÄ«d rakstu uz React Native, JavaScript un Elm kÄ hobiju, kas nav par pensiju, bet par aktÄ«vu darbu. Un arÄ« uz Python rakstu un, visticamÄk, turpinÄÅ”u strÄdÄt pie maŔīnmÄcīŔanÄs Java aizmugurÄm. Ir daudz populÄru valodu, un katrai ir interesantas iezÄ«mes. Katrs ir labs kaut kÄdÄ veidÄ, un var izmÄÄ£inÄt apvienot visas Ŕīs funkcijas. TÄpÄc es nodarbojos ar interesantu lietu izpÄti, valodas uzvedÄ«bu, cenÅ”oties izdomÄt saprÄtÄ«gu semantiku. Un pagaidÄm man tas padodas! Å obrÄ«d es cÄ«nos ar atmiÅas semantiku, jo gribu, lai tÄ bÅ«tu kÄ C un Java, un iegÅ«t spÄcÄ«gu atmiÅas modeli un atmiÅas semantiku ielÄdÄm un veikalÄ. TajÄ paÅ”Ä laikÄ iegÅ«t automÄtisku tipu izslÄgÅ”anu kÄ Haskell. LÅ«k, es cenÅ”os sajaukt Haskell-lÄ«dzÄ«gu tipu izslÄgÅ”anu ar atmiÅu, kas darbojas kÄ C un Java. Ar to es esmu nodarbojies pÄdÄjÄs 2-3 mÄneÅ”us, piemÄram.
Andrej: Ja jÅ«s veidojat valodu, kas Åem labÄkÄs aspekts no citÄm valodÄm, vai esat domÄjis par to, ka kÄds varÄtu izdarÄ«t pretÄjo: Åemt jÅ«su idejas un izmantot tÄs pie sevis?
Kliffs: TieÅ”i tÄ rodas jaunas valodas! KÄpÄc Java ir lÄ«dzÄ«ga C? TÄpÄc, ka C bija laba sintakse, ko visi saprata, un Java iedvesmojÄs no Ŕīs sintakses, pievienojot tam veida droŔību, masÄ«vu robežu pÄrbaudes, GC, un vÄl viÅi uzlaboja dažas lietas no C. ViÅi pievienoja savas. Bet viÅi tika spÄcÄ«gi iedvesmoti, vai ne? Visi stÄv uz milžu pleciem, kas bija pirms tevis ā tieÅ”i tÄ notiek progress.
Andrej: KÄ es saprotu, jÅ«su valoda bÅ«s droÅ”a attiecÄ«bÄ uz atmiÅas izmantoÅ”anu. Vai jÅ«s domÄjÄt Ä«stenot kaut ko lÄ«dzÄ«gu borrow checker no Rust? Vai jÅ«s to skatÄ«jÄties, kÄ jums patika?
Kliffs: Nu, es rakstu C jau veselu mūžību, ar visiem Å”iem malloc un free, un manuÄli pÄrvaldu dzÄ«ves ciklu. ZinÄt, 90-95% manuÄli pÄrvaldÄ«tÄ cikla ir ar vienÄdu struktÅ«ru. Un tas ir ļoti, ļoti sÄpÄ«gi to darÄ«t manuÄli. Es vÄlÄtos, lai kompilators vienkÄrÅ”i pateiktu, kas tur notiek un ko tu esi sasniedzis ar savÄm darbÄ«bÄm. DažÄm lietÄm borrow checker to dara automÄtiski. VÄl tam ir jÄspÄj automÄtiski izvest informÄciju, visam jÄbÅ«t saprotamam un pat nevajag mani slodzÄ«t ar to sapratni. Tam bÅ«tu jÄveic vismaz lokÄla aizbÄgÅ”anas analÄ«ze, un tikai tad, ja tas neizdodas, bÅ«tu jÄpievieno tipa anotÄcijas, kas apraksta dzÄ«ves ciklu ā un Å”Äda shÄma ir daudz sarežģītÄka nekÄ borrow checker vai jebkurÅ” cits esoÅ”ais atmiÅas pÄrbaudÄ«tÄjs. IzvÄle starp āviss ir labiā un āes neko nesaprotuā ā nÄ, tam jÄbÅ«t kaut kam labÄkam.Ā
TÄtad, kÄ cilvÄks, kurÅ” ir uzrakstÄ«jis daudz C koda, uzskatu, ka automÄtiskÄs dzÄ«ves cikla pÄrvaldÄ«bas atbalsts ir vissvarÄ«gÄkÄ lieta. Un mani arÄ« kaitina, cik daudz atmiÅas izmanto Java, un galvenÄ sÅ«dzÄ«ba ir par GC. Pie atmiÅas pieŔķirÅ”anas Java gadÄ«jumÄ tev atmiÅa, kas bija lokÄla pÄdÄjÄ GC ciklÄ, netiks atgriezta. ValodÄs ar precÄ«zÄku atmiÅas pÄrvaldÄ«bu tas nav tÄ. Ja izsaucat malloc, tu tÅ«lÄ«tÄjo saÅem atmiÅu, kas parasti tikko tika izmantota. Parasti tu veic kÄdas pagaidu darbÄ«bas ar atmiÅu un tÅ«lÄ«t to atgriez atpakaļ. Un tÄ uzreiz atgriežas malloc baseinÄ, un nÄkamajÄ malloc ciklÄ to atkal izvelk atpakaļ. TÄpÄc reÄlais atmiÅas patÄriÅÅ” samazinÄs lÄ«dz dzÄ«vÄ objektu kopumam konkrÄtÄ brÄ«dÄ« plus kļūmÄm. Un, ja tev nav tekŔķu nepiedienÄ«gos veidos, lielÄkÄ daļa atmiÅas nosÄdÄ«sies keÅ”os un procesorÄ, un tas darbosies Ätri. Bet tas prasa daudz roku darba ar atmiÅas pÄrvaldÄ«bu, izmantojot malloc un free, kas jÄsauc pareizajÄ secÄ«bÄ, pareizÄ vietÄ. Rust spÄj ar to tikt galÄ pareizi, un daudzos gadÄ«jumos pat nodroÅ”ina augstÄku veiktspÄju, jo atmiÅas patÄriÅÅ” tiek samazinÄts tikai lÄ«dz paÅ”reizÄjÄm aprÄÄ·iniem ā atŔķirÄ«bÄ no gaidīŔanas nÄkamajam GC ciklam, kas atbrÄ«vos atmiÅu. BeigÄs mÄs ieguvÄm ļoti interesantu veidu, kÄ uzlabot veiktspÄju. Un diezgan jaudÄ«gu ā tÄ teikt, es nodarbojos ar Å”ÄdÄm lietÄm datu apstrÄdÄ finanÅ”u tehnoloÄ£iju jomÄ, un tas ļÄva iegÅ«t paÄtrinÄjumu apmÄram piecas reizes. Tas ir diezgan nozÄ«mÄ«gs paÄtrinÄjums, it Ä«paÅ”i pasaulÄ, kur procesori neveicas ÄtrÄk, un mÄs joprojÄm gaidÄm uzlabojumus.
VeiktspÄjas inženiera karjera
Andrej: VÄlÄtos arÄ« pajautÄt par karjeru kopumÄ. JÅ«s kļuvÄt slavens, strÄdÄjot pie JIT HotSpot, pÄc tam pÄrcÄlÄties uz Azul ā un tÄ ir arÄ« JVM kompÄnija. Bet jÅ«s jau vairÄk nodarbojÄties ar aparatÅ«ru, nevis programmatÅ«ru. Un pÄc tam pÄkÅ”Åi pÄrgÄjÄt uz Big Data un Machine Learning, pÄc tam uz krÄpÅ”anas atklÄÅ”anu. KÄ tas notika? Tas ir ļoti atŔķirÄ«gi izstrÄdes jomas.
Kliffs: Esmu jau diezgan ilgi nodarbojies ar programmÄÅ”anu un esmu pÄrzÄ«mÄjis uz ļoti dažÄdÄm aktivitÄtÄm. Un, kad cilvÄki saka: Ā«O, tu taÄu esi tas, kurÅ” izstrÄdÄja JIT Java!Ā», tas vienmÄr ir smieklÄ«gi. Bet pirms tam es strÄdÄju pie PostScript klona ā valodas, kuru Apple kÄdreiz izmantoja saviem lÄzerprinteriem. Un vÄl pirms tam es veicu Forth valodas ievieÅ”anu. DomÄju, kopÄjÄ tÄma man ir rÄ«ku izstrÄde. Visa dzÄ«ve esmu veidojis rÄ«kus, ar kuriem citi cilvÄki raksta savas forÅ”Äs programmas. Bet es esmu strÄdÄjis arÄ« pie operÄtÄjsistÄmÄm, vadÄ«tÄjiem, kodola lÄ«meÅa atkļūdoÅ”anas rÄ«kiem, operÄtÄjsistÄmu izstrÄdes valodÄm, kas sÄkÄs triviÄli, bet laika gaitÄ kļuva arvien sarežģītÄkas. Bet galvenÄ tÄma tomÄr ir rÄ«ku izstrÄde. Liela daļa manas dzÄ«ves ir pagÄjusi starp Azul un Sun, un tÄ bija par Java. Bet, kad es sÄku nodarboties ar Big Data un MaŔīnmÄcīŔanos, es atkal uzlikÅ”u savu svinÄ«go cepuri un teicu: Ā«Ak, tagad mums ir netriviÄla problÄma, un Å”eit notiek vesela sÄrija interesantu lietu un cilvÄku, kuri kaut ko daraĀ». Tas ir lielisks ceļŔ attÄ«stÄ«bai, pa kuru ir vÄrts iet.
JÄ, es ļoti mÄ«lu izkliedÄtÄs aprÄÄ·inÄÅ”anas. Mana pirmÄ darba pieredze bija studentu gados, programmÄjot C valodÄ kÄdÄ reklÄmas projektÄ. Tas bija izkliedÄts aprÄÄ·ins uz Zilog Z80 mikroshÄmÄm, kuras vÄc datus analogam optiskajam teksta atpazīŔanai, ko nodroÅ”inÄja Ä«sts analoÄ£ais analizators. Tas bija aizraujoÅ”s un pavisam neparasts temats. TomÄr bija problÄmas, kÄda daļa netika pareizi atpazÄ«ta, tÄpÄc bija nepiecieÅ”ams izvilkt attÄlu un parÄdÄ«t to cilvÄkam, kurÅ” jau bija lasÄ«jis acÄ«m un paziÅot, kas tur ir rakstÄ«ts, un tÄpÄc bija darbi ar datiem, un Å”iem darbiem bija sava valoda. Bija bÄka, kas visu to apstrÄdÄja ā paralÄli strÄdÄjoÅ”Äs Z80 mikroshÄmas ar palaistiem vt100 terminÄliem ā pa vienam uz cilvÄku, un bija paralÄlo programmÄÅ”anas modelis uz Z80. Noteikta kopÄ«ga atmiÅas daļa, ko dalÄ«ja visas Z80 Å”ajÄ āzvaigznesā konfigurÄcijÄ; dalÄ«jÄs arÄ« bÄka, un puse RAM tika dalÄ«ta iekÅ”ÄjÄ tÄ«klÄ, un otra puse bija privÄta vai devÄs uz kaut ko citu. CieÅ”i sarežģīta paralÄla izkliedÄta sistÄma ar dalÄ«tu... daļÄji dalÄ«tu atmiÅu. Kad tas bija... Vairs neatceros, kaut kur astoÅdesmito gadu vidÅ«. Pietiekami sen.Ā
JÄ, uzskatÄ«sim, ka 30 gadi ir pietiekami ilgi. Uzdevumi, kas saistÄ«ti ar izkliedÄtÄm aprÄÄ·inÄÅ”anÄm, ir pastÄvÄjuÅ”i pietiekami ilgi, cilvÄki jau sen cÄ«nÄs ar -klasteriem. Å Ädi klasteri izskatÄs kÄ⦠PiemÄram: ir Ethernet, un tavs Ätrais x86 ir pievienots Å”im Ethernet, un tagad tu vÄlies iegÅ«t viltoto kopÄ«go atmiÅu, jo neviens todien nevarÄja nodarboties ar sadalÄ«to aprÄÄ·inu kodÄÅ”anu, tas bija pÄrÄk sarežģīti, un tÄdÄļ bija viltota kopÄ«gÄ atmiÅa ar atmiÅas lapu aizsardzÄ«bu uz x86, un ja tu rakstÄ«ji Å”ajÄ lapÄ, tad mÄs paziÅojÄm citiem procesoriem, ka, ja viÅi piekļūst tai paÅ”ai kopÄ«gajai atmiÅai, tÄ jÄielÄdÄ no tevis, un tÄdÄjÄdi radÄs kaut kas lÄ«dzÄ«gs keÅ”u saskaÅoÅ”anas protokolam un programmatÅ«rai tam. Interesanta koncepcija. PatiesÄ problÄma, protams, bija citur. Viss tas darbojÄs, bet tu Ätri saskÄrÄs ar veiktspÄjas problÄmÄm, jo neviens nesaprata veiktspÄjas modeli pietiekami labi ā kÄdi ir piekļuves modeļi uz atmiÅu, kÄ panÄkt, lai mezgli nemitÄ«gi nesazinÄtos savÄ starpÄ, un tÄ tÄlÄk.
H2O man ir radÄ«jusi Å”Ädu ideju: paÅ”i izstrÄdÄtÄji ir atbildÄ«gi par to, lai noteiktu, kur ir slÄpÅ”anÄs paralÄlisms un kur tÄ nav. Es izdomÄju tÄdu kodÄÅ”anas modeli, ka ir viegli un vienkÄrÅ”i rakstÄ«t augstas veiktspÄjas kodu. TaÄu uzrakstÄ«t lÄni strÄdÄjoÅ”u kodu ir grÅ«ti, tas izskatÄ«sies slikti. Ir jÄpieliek lielas pÅ«les, lai uzrakstÄ«tu lÄnu kodu; bÅ«s jÄpielieto nestandarta metodes. LÄns kods ir redzams jau pirmajÄ mirklÄ«. TÄdÄļ parasti tiek rakstÄ«ts kods, kas strÄdÄ Ätri, bet jums jÄtiek galÄ ar to, kas jÄdara kopÄ«gas atmiÅas gadÄ«jumÄ. Tas viss ir saistÄ«ts ar lieliem masÄ«viem, un uzvedÄ«ba tajos ir lÄ«dzÄ«ga nevolatÄ«viem lieliem masÄ«viem paralÄlajÄ Java. IedomÄjieties, ka divi pavedieni raksta paralÄlajÄ masÄ«vÄ, viens no tiem uzvar, bet otrs, attiecÄ«gi, zaudÄ, un jÅ«s nezinÄt, kurÅ” no viÅiem ir kurÅ”. Ja tie nav volatÄ«vi, secÄ«ba var bÅ«t jebkÄda ā un tas tieÅ”Äm darbojas labi. CilvÄkiem ir svarÄ«gi operÄciju secÄ«ba, viÅi pareizi izvieto volatÄ«vos un pareizajÄs vietÄs sagaida veiktspÄjas problÄmas, kas saistÄ«tas ar atmiÅu. SavÄdÄk viÅi vienkÄrÅ”i rakstÄ«tu kodu kÄ ciklus no 1 lÄ«dz N, kur N ir daži triljoni, cerot, ka visi sarežģītie gadÄ«jumi automÄtiski kļūs paralÄli ā un tur tas nedarbojas. Bet H2O nav ne Java, ne Scala, to var uzskatÄ«t par āJava mÄ«nuss mÄ«nussā, ja gribas. Tas ir ļoti saprotams programmÄÅ”anas stils, un tas ir lÄ«dzÄ«gs vienkÄrÅ”a koda rakstīŔanai C vai Java ar cikliem un masÄ«viem. Bet tajÄ paÅ”Ä laikÄ atmiÅu var apstrÄdÄt terabaitiem. Es vÄl joprojÄm izmantoju H2O. Laiku pa laikam to izmantoju dažÄdos projektos ā un tas joprojÄm ir ÄtrÄkais risinÄjums, kas desmitiem reižu apsteidz konkurentus. Ja jÅ«s veicat Big Data ar kolonnveida datiem, ir ļoti grÅ«ti pÄrspÄt H2O.
Tehniskie izaicinÄjumi
Andrej: KÄds ir bijis vislielÄkais izaicinÄjums jÅ«su karjerÄ?
Kliffs: Vai mÄs apspriežam tehnisko vai ne tehnisko jautÄjumu? Es teiktu, ka lielÄkie izaicinÄjumi ir tehniskie.Ā
RunÄjot par tehniskajiem izaicinÄjumiem. Es tos vienkÄrÅ”i pÄrvarÄju. Pat nezinu, kurÅ” no tiem bija vislielÄkais, taÄu bija vairÄki diezgan interesanti, kas prasÄ«ja diezgan daudz laika un mentÄlÄs cÄ«Åas. Kad es devos uz Sun, biju pÄrliecinÄts, ka izveidoÅ”u Ätru kompilatoru, bet daudzie seniori, pieminot to, teica, ka man nekas nesanÄks. Bet es izŔķīros doties Å”o ceļu, uzrakstÄ«ju kompilatoru lÄ«dz reÄ£istru pieŔķirÅ”anas lÄ«menim, un tas bija diezgan Ätrs. Tas bija tikpat Ätrs kÄ mÅ«sdienu C1, bet tajÄ laikÄ reÄ£istru pieŔķirÅ”ana bija daudz lÄnÄka, un, raugoties atpakaļ, tÄ bija liela datu struktÅ«ras problÄma. Man vajadzÄja to, lai uzrakstÄ«tu grafisko reÄ£istru pieŔķirÅ”anu, un es nesapratu dilemmu starp koda izteiksmÄ«bu un Ätrumu, kas pastÄvÄja tajÄ laikÄ un bija ļoti svarÄ«ga. IzrÄdÄ«jÄs, ka datu struktÅ«ra parasti pÄrsniedz keÅ”atmiÅas izmÄru x86 procesoros tajÄ laikÄ, un tÄpÄc, ja es sÄkotnÄji pieÅÄmÄju, ka reÄ£istru pieŔķirÅ”ana prasÄ«s 5-10 procentus no visa jÄ«tÄÅ”anas laika, tad realitÄtÄ tas izrÄdÄ«jÄs 50 procenti.
Laiks gÄja, kompilators kļuva arvien skaidrÄks un produktÄ«vÄks, pÄrstÄja Ä£enerÄt Å”ausminoÅ”u kodu lielÄkajÄ daÄ¼Ä gadÄ«jumu, un veiktspÄja arvien vairÄk sÄka lÄ«dzinÄties tam, ko sniedz C kompilators. Ja, protams, tu neraksti kaut kÄdu muļķību, ko pat C nevar paÄtrinÄt. Ja tu raksti kodu kÄ C, tu arÄ« saÅem rezultÄtu, kas ir produktÄ«vs kÄ C lielÄkajÄ daÄ¼Ä gadÄ«jumu. Un jo tÄlÄk, jo biežÄk kods izrÄdÄ«jÄs asimptotiski atbilstoÅ”s C lÄ«menim, reÄ£istru pieŔķirÅ”ana sÄka izskatÄ«ties kÄ kaut kas pabeigts... neatkarÄ«gi no tÄ, vai tavs kods darbojas Ätri vai lÄni. Es turpinÄju strÄdÄt pie reÄ£istru pieŔķirÅ”anas, lai tÄ nodroÅ”inÄtu labÄkas pieŔķirÅ”anas. TÄ kļuva lÄnÄka un lÄnÄka, bet sniedza arvien labÄkus rezultÄtus tajÄs situÄcijÄs, kur vairÄk nevienam neizdevÄs. Es varÄju ienirt reÄ£istru pieŔķirÅ”anÄ, pavadÄ«t tur mÄnesi darbÄ, un pÄkÅ”Åi viss kods sÄka darboties par 5% ÄtrÄk. Tas notika vairÄkkÄrt, un reÄ£istru pieŔķirÅ”ana kļuva par kaut ko lÄ«dzÄ«gu mÄkslas darba statusam ā visi to mÄ«lÄja vai ienida, un akadÄmiskÄs pasaules pÄrstÄvji uzdeva jautÄjumus par to, Ā«kÄpÄc viss tiek darÄ«ts tieÅ”i tÄĀ». , un kÄda ir atŔķirÄ«ba. Atbilde ir vienÄda: grafu krÄsoÅ”anas bÄzes alokators plus ļoti rÅ«pÄ«ga saskarne ar buferkodu ir uzvaras instruments, labÄkÄ kombinÄcija, ko neviens nevar sakaut. Un tas ir diezgan neuztverams moments. Viss pÄrÄjais, ko dara kompilators ā ir diezgan pazÄ«stamas lietas, lai gan tÄs arÄ« ir attÄ«stÄ«tas lÄ«dz mÄkslas lÄ«menim. Es vienmÄr veicu lietas, kas vajadzÄja pÄrvÄrst kompilatoru par mÄkslas darbu. Bet nekas no tÄ nebija nekas ÄrkÄrtÄjs ā izÅemot reÄ£istru alokatoru. Triks ir tajÄ, ka ir jÄbÅ«t rÅ«pÄ«gam zem slodzes, un, ja tas notiek (es varu izskaidrot detalizÄtÄk, ja tas ir interesanti), tas nozÄ«mÄ, ka var izvietot agresÄ«vÄk, neriskÄjot pÄrsniegt snieguma grafika salauÅ”anas punktu. Tajos laikos bija daudz pilna mÄroga kompilatoru, kas bija pielÄgoti ar visÄdiem uzlabojumiem un zvaniÅiem, kuru sastÄvÄ bija reÄ£istru alokatori, bet neviens tÄ vairs nespÄja.
ProblÄma ir tÄda, ka, ja tu pievieno metode, kas tiek inline'ota, palielinot un palielinot inline zonas, izmantoto vÄrtÄ«bu skaits momentÄni pÄrsniedz reÄ£istru skaitu, un ir jÄnotiek spillam. Kritiskais lÄ«menis parasti rodas, kad alokators padodas, un viens labs kandidÄts uz spilla maksÄ vairÄk nekÄ cits, tu spilli kaut kÄdas pilnÄ«gi trakas lietas. Inline'ÄÅ”anas vÄrtÄ«ba ir tÄda, ka tu zaudÄ daļu overhead, overhead uz izsaukumu un saglabÄÅ”anu, tu vari redzÄt vÄrtÄ«bas iekÅ”Ä un vari tÄs tÄlÄk optimizÄt. Inline'ÄÅ”anas cena ir tÄda, ka rodas liels dzÄ«vÄs vÄrtÄ«bu skaits, un, ja tavs reÄ£istru alokators izspiež vairÄk, nekÄ nepiecieÅ”ams, tu momentÄni zaudÄ. TÄdÄļ lielÄkajai daļai alokatoru ir problÄma: kad inline'ÄÅ”ana pÄrsniedz kÄdu robežu, sÄk spilties viss, un veiktspÄju var norakstÄ«t podÄ. Tie, kas realizÄ kompilatoru, pievieno kaut kÄdas heuristikas: piemÄram, lai apturÄtu inline'ÄÅ”anu, sÄkot no kÄda pietiekami lielÄ izmÄra, jo alokÄcijas visu sabojÄs. TÄ rodas veiktspÄjas grafika salauzums ā tu inline'Ä, inline'Ä, veiktspÄja pamazÄm pieaug ā un tad bum! ā tÄ krÄ«t uz leju strauji, jo tu esi inline'Äjis pÄrÄk daudz. TÄ viss arÄ« strÄdÄja lÄ«dz Java parÄdīŔanai. Java prasa daudz vairÄk inline'ÄÅ”anas, tÄpÄc man bija jÄpadara mans alokators daudz agresÄ«vÄks, lai tas izlÄ«dzinÄtos, nevis kristu, un, ja tu esi pÄrÄk daudz inline'Äjis ā tas sÄk spilties, bet tad tÄpat pienÄk brÄ«dis "nav vairÄk spilla". Tas ir interesants novÄrojums un tas man ienÄca prÄtÄ tieÅ”i no nekurienes, neviennozÄ«mÄ«gs, bet labi atmaksÄjies. Es pievÄrsos agresÄ«vai inline'ÄÅ”anai un tas noveda mani tÄdÄs vietÄs, kur Java un C veiktspÄja ir blakus. TieÅ”Äm tuvu ā es varu rakstÄ«t Java kodu, kas bÅ«s ievÄrojami ÄtrÄks par C kodu un tamlÄ«dzÄ«gi, bet vidÄji, lielajÄ attÄlÄ, tie ir aptuveni salÄ«dzinÄmi. DomÄju, daļa no Ŕī nopelna ir reÄ£istru alokators, kas ļauj man inline'ot maksimÄli bezgaumÄ«gi. Es vienkÄrÅ”i inline'Äju visu, ko redzu. JautÄjums ir, vai alokators darbojas labi, vai iznÄk saprÄtÄ«gs kods. Tas bija liels izaicinÄjums: saprast visu to un likt tam strÄdÄt.
Nedaudz par reģistru pieŔķirŔanu un daudzprocesoru skaitļoŔanu
Vladimirs: ProblÄmas, piemÄram, reÄ£istru alokÄcija, Ŕķiet kÄ kÄda mūžīga tÄma. Interesanti, vai bija tÄ, ka kÄda ideja izskatÄ«jÄs solÄ«ga, bet tad praktiski izgÄzÄs?
Kliffs: Protams! ReÄ£istru alokÄcija ir joma, kurÄ, lai atrisinÄtu NP-grÅ«tÄ«bu uzdevumu, tu mÄÄ£ini atrast kÄdas heuristikas. Un tu nekad nespÄsi panÄkt ideÄlu risinÄjumu, vai ne? Tas vienkÄrÅ”i ir neiespÄjami. Skatieties, Ahead of Time kompilÄcija ā tÄ arÄ« darbojÄs slikti. Å eit runa ir par kÄdiem vidÄjiem gadÄ«jumiem. Par tipisku veiktspÄju, tÄpÄc var doties un izmÄrÄ«t kaut ko, ko tu uzskati par labu tipisku veiktspÄju ā galu galÄ tu taÄu strÄdÄ pie tÄs uzlaboÅ”anas! ReÄ£istru alokÄcija ir tÄma, kas pilnÄ«bÄ veltÄ«ta veiktspÄjai. TiklÄ«dz tev ir pirmais prototips, kas strÄdÄ un nokrÄso, kas nepiecieÅ”ams, sÄkas darbs pie veiktspÄjas. NepiecieÅ”ams iemÄcÄ«ties labi mÄrÄ«t. KÄpÄc tas ir svarÄ«gi? Ja ir skaidri dati, var skatÄ«ties uz dažÄdÄm teritorijÄm un redzÄt: ah, tas Å”eit palÄ«dzÄja, bet tur viss sabojÄjÄs! ParÄdÄs dažas labas idejas, tu pievieno jaunu heuristiku un pÄkÅ”Åi viss vidÄji sÄk darboties nedaudz labÄk. Vai arÄ« nesÄk. Man bija daudz gadÄ«jumu, kad mÄs cÄ«nÄ«jÄmies par piecÄm procentÄm veiktspÄjas, kas atŔķīra mÅ«su izstrÄdi no iepriekÅ”ÄjÄ alokatora. Un katrÄ reizÄ tas izskatÄs tÄ: kaut kur vinnÄja, kaut kur zaudÄja. Ja tev ir labi veiktspÄjas analÄ«zes rÄ«ki, var atrast zaudÄjuÅ”Äs idejas un saprast, kÄpÄc tÄs zaudÄ. VarbÅ«t ir vÄrts atstÄt visu pa vecam, bet varbÅ«t nopietni pievÄrsties smalkai regulÄÅ”anai, vai doties un salabot kaut ko citu. Tas ir vesels komplekss! Es izdarÄ«ju Å”o forÅ”o haku, bet man nepiecieÅ”ams arÄ« Å”is, un Å”is, un Å”is ā un to kopÄjÄ kombinÄcija nodroÅ”ina kÄdus uzlabojumus. Bet vienas idejas var neizdoties. TÄ ir NP-grÅ«tÄ«bu uzdevumu veiktspÄjas darba daba.
Vladimirs: Veidojas sajÅ«ta, ka tÄdas lietas kÄ krÄsoÅ”ana alokatoros ā ir jau atrisinÄta problÄma. Nu, jums tÄ Å”Ä·iet atrisinÄta, spriežot pÄc tÄ, ko jÅ«s stÄstÄt, vai tad vispÄr vajagā¦
Kliffs: TÄ nav atrisinÄta kÄ tÄda. Tev tas jÄpÄrvÄrÅ” par āatrisinÄtuā. Ir smagas problÄmas, un tÄs ir jÄrisina. Kad tas ir izdarÄ«ts, pienÄk laiks strÄdÄt pie veiktspÄjas. Uz Å”o darbu jÄattiecas atbilstoÅ”i - veikt testus, vÄkt metriku, izskaidrot situÄcijas, kad, atgriežoties pie iepriekÅ”ÄjÄs versijas, tavs vecais hack atkal sÄka darboties (vai otrÄdi, pÄrstÄja). Un nevajag atkÄpties, kamÄr kaut ko nepanÄk. KÄ jau teicu, ja forÅ”as idejas, kas neizdevÄs, bet ideju reÄ£istra alokÄcijas jomÄ ir aptuveni bezgalÄ«gi. Var, piemÄram, lasÄ«t zinÄtniskos izdevumus. Lai gan Å”obrÄ«d Ŕī joma virzÄs daudz lÄnÄk un ir kļuvusi skaidrÄka nekÄ savÄs jaunÄ«bas dienÄs. TomÄr Å”ajÄ jomÄ strÄdÄ vesela bezgalÄ«ba cilvÄku, un visas viÅu idejas ir vÄrts izmÄÄ£inÄt, visas gaida savu brÄ«di. Un tu nevari pateikt, cik labi tÄs ir, ja nemÄÄ£ini. Cik labi tÄs integrÄjas ar visu pÄrÄjo tavÄ alokatorÄ, jo alokators veic daudzas lietas, un dažas idejas tavÄ konkrÄtajÄ alokatorÄ var nedarboties, bet citÄ alokatorÄ ā bez problÄmÄm. Galvenais veids, kÄ uzvarÄt alokatoram, ir izvilkt lÄnos elementus Ärpus galvenÄ ceļa un piespiedu kÄrtÄ sadalÄ«t pa lÄno ceļu malÄm. TÄpÄc, ja tu gribi palaist GC, iet pa lÄno ceļu, deoptimizÄt, izmest izÅÄmumu, viss Å”ÄdÄ garÄ - tu zini, ka Ŕīs lietas ir salÄ«dzinoÅ”i retas. Un tÄs tieÅ”Äm ir reti, esmu pÄrbaudÄ«jis. Tu veic papildu darbu, un pateicoties tam pazÅ«d daudz ierobežojumu uz Å”iem lÄnajiem ceļiem, bet tas nav ļoti svarÄ«gi, jo tie ir lÄni un pa tiem reti pÄrvietojas. PiemÄram, nulles rÄdÄ«tÄjs - tas nekad nenotiek, vai ne? Ir jÄbÅ«t vairÄkÄm ceļa variantÄm dažÄdÄm lietÄm, bet tÄm nevajadzÄtu sajaukties galvenajÄ.Ā
Vladimirs: Ko tu domÄ par daudzkodolu, kad kodolu ir tÅ«kstoÅ”iem? Vai tÄ ir noderÄ«ga lieta?
Kliffs: GPU panÄkumi parÄda, ka tÄ ir diezgan noderÄ«ga!
Vladimirs: Tie ir diezgan specializÄti. Bet ko par vispÄrÄ«gÄs lietoÅ”anas procesoriem?
Kliffs: Nu, tÄ bija Azul biznesa modelis. Atbilde nÄca vÄl tajÄ Äras laikÄ, kad cilvÄki ļoti mÄ«lÄja prognozÄjamu veiktspÄju. TajÄ laikÄ bija grÅ«ti rakstÄ«t paralÄlo kodu. H2O kodÄÅ”anas modelis labi pielÄgojas, bet tas nav vispÄrÄjas lietoÅ”anas modelis. DrÄ«zÄk tas ir nedaudz vispÄrÄ«gÄks nekÄ, izmantojot GPU. MÄs runÄjam par Å”Äda veida izstrÄdes grÅ«tÄ«bÄm vai par tÄs izmantoÅ”anas sarežģītÄ«bu? PiemÄram, interesants mÄcÄ«bu stunda, ko man deva Azul, diezgan neskaidrs: mazi keÅ”i - tas ir normÄli.Ā
LielÄkais izaicinÄjums dzÄ«vÄ
Vladimirs: KÄ ir ar netehniskiem izaicinÄjumiem?
Kliffs: LielÄkais izaicinÄjums bija nenotikties⦠laipni un labi pret cilvÄkiem. Un kÄ sekas, es pastÄvÄ«gi nonÄcu ļoti konfliktos situÄcijÄs. TajÄs, kurÄs es zinÄju, ka viss norit nepareizi, bet nezinÄju, kÄ virzÄ«ties uz priekÅ”u Å”o problÄmu risinÄÅ”anÄ un nespÄju ar tÄm tikt galÄ. Daudzas ilgas problÄmas, kas ilga desmitiem gadu, radÄs tieÅ”i Å”ÄdÄ veidÄ. Tas, ka Java ir kompilatori C1 un C2 ā ir tieÅ”a Ŕī sekas. Tas, ka Java desmit gadu garumÄ nebija daudzlÄ«meÅu kompilÄcijas ā arÄ« ir tieÅ”a sekas. AcÄ«mredzami, ka mums Å”Äda sistÄma bija nepiecieÅ”ama, bet nav skaidrs, kÄpÄc tÄs nebija. Man bija problÄmas ar vienu inženieri⦠vai inženieru grupu. Pirms daudziem gadiem, kad es sÄku strÄdÄt Sun, es biju⦠Labi, ne tikai toreiz, man vispÄr vienmÄr ir savs viedoklis. Un es uzskatÄ«ju, ka var vienkÄrÅ”i paÅemt Å”o savu patiesÄ«bu un izteikt to tieÅ”i. TurklÄt, es biju Å”okÄjoÅ”i pareizs lielÄko daļu laika. Un, ja tev Å”Äds pieeja nepatÄ«k⦠jo Ä«paÅ”i, ja tu acÄ«mredzami kļūdies un dari muļķības⦠VispÄr, nedaudzi cilvÄki varÄja paciest Å”Ädu komunikÄcijas formu. TomÄr daži varÄja, piemÄram, es. Es visu savu dzÄ«vi esmu bÅ«vÄjis uz meritokrÄtiskiem principiem. Ja tu man parÄdÄ«si kaut ko nepareizu, es tÅ«lÄ«t pagriezīŔos un teikÅ”u: tu teici muļķības. To darot, protams, atvainojos un visu tÄdu, atzīŔu nopelnu, ja tÄdi vispÄr pastÄv, un veicu citas pareizas darbÄ«bas. No otras puses, es esmu Å”okÄjoÅ”i pareizs Å”okÄjoÅ”i lielÄ procentÄ kopÄjÄ laika. Un tas nevis ir ļoti labi strÄdÄ attiecÄ«bÄs ar cilvÄkiem. Es nemaz nemÄÄ£inu bÅ«t laipns, bet nostÄdÄ«ju jautÄjumu uz paplÄtes. āÅ is nekad nestrÄdÄs, jo viens, divi un trÄ«s.ā Un viÅi tÄdi: āAk!ā Bija arÄ« citi sekas, kuras, iespÄjams, labÄk bÅ«tu izlaižu: piemÄram, tÄdi, kas noveda pie ŔķirÅ”anÄs ar sievu un desmit gadu depresijas pÄc tam.
IzaicinÄjums ir cÄ«Åa ar cilvÄkiem, ar viÅu uztveri par to, ko tu vari vai nevari darÄ«t, kas ir svarÄ«gi un kas nav. Ir bijuÅ”i daudzi izaicinÄjumi par kodÄÅ”anas stilu. Es joprojÄm rakstu daudz kodu, un tajos laikos man pat nÄcÄs palÄninÄt tempu, jo es veicu pÄrÄk daudz paralÄlu uzdevumu un neizdarÄ«ju tos labi, nevis koncentrÄjos uz vienu. Atgriežoties pagÄtnÄ, es uzrakstÄ«ju pusi no Java JIT komandas koda, C2 komandas. NÄkamais ÄtrÄkais kodÄtÄjs rakstÄ«ja uz pusi lÄnÄk, nÄkamais ā vÄl uz pusi lÄnÄk, un tas bija eksponenciÄls kritums. SeptÄ«tais cilvÄks Å”ajÄ rindÄ bija ļoti, ļoti lÄns ā tÄ vienmÄr ir! Es strÄdÄju ar daudz kodu. Es skatÄ«jos, kurÅ” ko raksta, bez izÅÄmumiem, es skatÄ«jos viÅu kodu, veicu pÄrskatus par katru no viÅiem un joprojÄm turpinÄju rakstÄ«t vairÄk nekÄ kÄds no viÅiem. Ar cilvÄkiem Å”Äda pieeja ne vienmÄr darbojÄs labi. Daži to nepatika. Un kad viÅi ar to nespÄja tikt galÄ, sÄkÄs visÄda veida sÅ«dzÄ«bas. PiemÄram, reiz man tika teikts pÄrtraukt rakstÄ«t kodu, jo es rakstu pÄrÄk daudz kodu, un tas apdraud komandu, un viss tas man izklausÄ«jÄs kÄ joks: Äalis, ja visa pÄrÄjÄ komanda izzudÄ«s un es turpinÄÅ”u rakstÄ«t kodu, tu zaudÄsi tikai pusi komandas. No otras puses, ja es turpinÄÅ”u rakstÄ«t kodu un tu zaudÄsi pusi komandas ā tas izklausÄs pÄc ļoti sliktas pÄrvaldÄ«bas. Es nekad par to daudz nedomÄju, nekad par to nerunÄju, bet tas tomÄr bija kaut kur manÄ prÄtÄ. ApziÅÄ riÅÄ·oja doma: 'JÅ«s taÄu jokojat?'. LÄ«dz ar to, vislielÄkÄ problÄma biju es un manas attiecÄ«bas ar cilvÄkiem. Tagad es saprotu sevi daudz labÄk, es ilgi biju komandas vadÄ«tÄjs programmÄtÄjiem, un tagad es taisni saku cilvÄkiem: zini, es esmu tÄds, kÄds es esmu, un jums bÅ«s jÄarÄ« ar mani ā vai ir labi, ja es Å”eit pastÄvu? Un kad viÅi ar to sÄka tikt galÄ, viss sÄka darboties. Es nevienam neesmu ne slikts, ne labs, man nav nekÄdu sliktu nodomu vai egoistisku tieksmju, tas vienkÄrÅ”i ir mans bÅ«tÄ«ba, un ar to kaut kÄ jÄdzÄ«vo.
AndrejPavisam nesen visi sÄka runÄt par paÅ”apziÅu introvertiem un vispÄr par mÄ«kstajÄm prasmÄm. Ko par to var teikt?
Kliffs: JÄ, tas bija izpratne un mÄcÄ«ba, ko es guvu no ŔķirÅ”anÄs ar sievu. Ko es guvu no ŔķirÅ”anÄs ā tÄ ir izpratne par sevi. TÄ es sÄku saprast citus cilvÄkus. Saprast, kÄ darbojas Ŕī mijiedarbÄ«ba. Tas izsauca atklÄjumus viens pÄc otra. ParÄdÄ«jÄs apziÅa, kas es esmu, un kas esmu. Ko es daru: vai es esmu noraizÄjies par uzdevumu, vai izvairos no konflikta, vai kaut kas cits ā un Å”Äds paÅ”apziÅas lÄ«menis tieÅ”Äm palÄ«dz turÄt sevi rokÄs. PÄc tam viss iet daudz vieglÄk. Viens punkts, ko es esmu atklÄjis ne tikai sev, bet arÄ« citiem programmÄtÄjiem ā nespÄja verbilizÄt domas, kad esi emocionÄlÄ stresa stÄvoklÄ«. PiemÄram, tu sÄdi un kodÄ, esi plÅ«smÄ, un tad pie tevis pienÄk un sÄk kliegt histÄrijÄ, ka kaut kas ir salÅ«zis, un tagad tiks pielietoti ekstrÄmi pasÄkumi. Un tu nespÄj neko pateikt, jo esi emocionÄlÄ stresa stÄvoklÄ«. IegÅ«tÄ zinÄÅ”anÄs ļauj sagatavoties Å”im mirklim, izdzÄ«vot to un pÄriet uz atkÄpÅ”anÄs plÄnu, pÄc kura var darÄ«t kaut ko. TÄtad, jÄ, kad tu sÄk saprast, kÄ viss tas darbojas ā tas ir milzÄ«gs notikums, kas maina dzÄ«vi.Ā
Es pats neizdevÄs atrast pareizos vÄrdus, bet atcerÄjos darbÄ«bu secÄ«bu. JÄga ir tÄda, ka Ŕī reakcija ir tikpat fiziska, cik verbÄla, un tev ir nepiecieÅ”ama telpa. TÄdu telpu, zenÄ. TieÅ”i to ir nepiecieÅ”ams izskaidrot, un tad uzreiz atkÄpties ā tÄ«ri fiziski atkÄpties. Kad es klusÄju ar vÄrdiem, es varu apstrÄdÄt situÄciju emocionÄlajÄ daļÄ. PÄc tam, kad adrenalÄ«ns nonÄk smadzenÄs, tu pÄrej uz
Un tÄdÄļ ir nepiecieÅ”ama verbÄlÄ telpa. VienkÄrÅ”i brÄ«va telpa. Ja vispÄr kaut ko teikt, tad var tieÅ”i to apgalvot, un pÄc tam doties un patieÅ”Äm atrast sev "telpu": doties pastaigÄ pa parku, ieslÄgties duÅ”Ä ā nav nozÄ«mes. Galvenais ir uz laiku atslÄgties no tÄs situÄcijas. Tikko tu pat uz dažÄm sekundÄm atslÄdzies, atgriežas kontrole, tu sÄk domÄt skaidri. "Labi, es neesmu idiots, es nedaru muļķīgas lietas, es esmu diezgan noderÄ«gs cilvÄks." TiklÄ«dz tu spÄj pÄrliecinÄt pats sevi, ir laiks pÄriet uz nÄkamo posmu: saprast, kas noticis. Tevi uzbruka, uzbrukums nÄca no negaidÄ«tas vietas, tÄ bija negodÄ«ga izsistÄ«ba. Tas ir slikti. NÄkamais solis ā saprast, kÄpÄc uzbrucÄjam tas bija nepiecieÅ”ams. PatiesÄ«bÄ, kÄpÄc? VarbÅ«t tÄpÄc, ka viÅÅ” pats ir dusmÄ«gs? KÄpÄc viÅÅ” ir dusmÄ«gs? PiemÄram, tÄpÄc, ka viÅÅ” pats ir kļūdÄ«jies un nevar uzÅemties atbildÄ«bu? Å ÄdÄ veidÄ ir jÄpievÄrÅ”as visai situÄcijai. Bet tam ir nepiecieÅ”ama manevrÄÅ”anas telpa, verbÄlÄ telpa. Pirmais solis ā pÄrtraukt verbÄlo kontaktu. Aiziet no vÄrdu apsprieÅ”anas. Atcelt to, aiziet prom, cik Ätri vien iespÄjams. Ja tas ir telefona saruna ā vienkÄrÅ”i noliec klausuli ā Ŕī ir prasme, kuru es guvu no sarunÄm ar bijuÅ”o sievu. Ja saruna nenoved pie nekas laba, vienkÄrÅ”i saki "uz redzÄÅ”anos" un noliec klausuli. No otras puses: "bla-bla-bla", tu atbildi: "aha, uz redzÄÅ”anos!" un noliec klausuli. VienkÄrÅ”i pÄrtrauc sarunu. PÄc piecÄm minÅ«tÄm, kad tev atgriežas spÄja skaidri domÄt, tu esi nedaudz atdzisis, kļūst iespÄjams visu pÄrdomÄt, kas vispÄr notika un kas notiks tÄlÄk. Un sÄkt formulÄt pÄrdomÄtu atbildi, nevis vienkÄrÅ”i reaÄ£Ät uz emocijÄm. ManÄ paÅ”a apziÅas attÄ«stÄ«bÄ tieÅ”i tas, ka emocionÄlÄ stresa gadÄ«jumÄ es nevaru runÄt, ir bijis atklÄjums. Iziet no Ŕīs stÄvokļa, apdomÄt un plÄnot, kÄ atbildÄt un kompensÄt problÄmas ā Å”ie ir pareizi soļi gadÄ«jumÄ, ja nevar runÄt. VienkÄrÅ”Äkais veids ā aizbÄgt no situÄcijas, kurÄ izpaužas emocionÄlais stress un vienkÄrÅ”i pÄrtraukt piedalÄ«ties Å”ajÄ stresÄ. PÄc tam tu atgÅ«sti spÄju domÄt, kad tu vari domÄt, parÄdÄs iespÄja runÄt, un tÄ tÄlÄk.
Starp citu, pretÄjÄs puses advokÄts tiesÄ mÄÄ£ina darÄ«t to ar tevi ā tagad jau ir skaidrs, kÄpÄc. Jo viÅam ir iespÄja tevi apspiest lÄ«dz tÄdai pakÄpei, ka tu pat nevari izrunÄt savu vÄrdu, piemÄram. TieÅ”Ä nozÄ«mÄ, tu nespÄji runÄt. Ja tas notiek ar tevi un ja tu zini, ka nonÄksi vietÄ, kur plosÄs verbÄlas cÄ«Åas, piemÄram, tiesÄ, tu vari atnÄkt ar savu juristu. Jurists aizstÄvÄs tevi un pÄrtrauks verbÄlo uzbrukumu, un to izdarÄ«s pavisam likumÄ«gi, un tev atgriezÄ«sies zaudÄtais zen telpas sajÅ«ta. PiemÄram, man dažreiz bija nepiecieÅ”ams piezvanÄ«t Ä£imenei, tiesnesis pret to attiecÄs diezgan draudzÄ«gi, bet pretÄjÄs puses advokÄts kliedza un kliedza uz mani, es pat vÄrdu nevarÄju ievietot. Å ÄdÄs situÄcijÄs man vislabÄk strÄdÄ starpnieka izmantoÅ”ana. Starpnieks pÄrtrauc visu Å”o spiedienu, kas tev nepÄrtraukti plÅ«st virsÅ«, tu atrod nepiecieÅ”amo zen telpas sajÅ«tu, kopÄ ar to atgriežas spÄja runÄt. Tas ir vesela zinÄÅ”anu joma, kurÄ jÄapgÅ«st daudz, daudz jÄatklÄj sevÄ«, un viss tas pÄrvÄrÅ”as augsta lÄ«meÅa stratÄÄ£iskos risinÄjumos, kas ir dažÄdi atkarÄ«bÄ no cilvÄka. Dažiem cilvÄkiem nav augstÄk minÄto problÄmu, parasti tÄs nav cilvÄkiem, kas profesionÄli nodarbojas ar pÄrdoÅ”anu. Visi Å”ie cilvÄki, kas pelna iztiku ar vÄrdiem ā pazÄ«stami dziedÄtÄji, dzejnieki, reliÄ£iskie darbinieki un politiÄ·i, viÅiem vienmÄr ir ko teikt. ViÅiem nav Å”Ädu problÄmu, bet man tÄs ir.
Andrej: Tas bija⦠negaidÄ«ti. Lieliski, mÄs jau esam diezgan daudz runÄjuÅ”i un ir laiks noslÄgt Å”o interviju. MÄs noteikti tiksimies konferencÄ un varÄsim turpinÄt Å”o dialogu. Tiksimies Hydra!
TurpinÄt sarunu ar Klifu varÄs konferencÄ Hydra 2019, kas notiks 11.-12. jÅ«lijÄ 2019. gadÄ SanktpÄterburgÄ. ViÅÅ” ieradÄ«sies ar ziÅojumu . Biļetes var iegÄdÄties .
Avots: habr.com
