Lieliska intervija ar Klifu Kliku, JIT kompilÄcijas Java valodÄ tÄvu
KlikŔķis KlikŔķis ā Cratus (IoT sensori procesu uzlaboÅ”anai) CTO, vairÄku jaunuzÅÄmumu (tostarp Rocket Realtime School, Neurensic un H2O.ai) dibinÄtÄjs un lÄ«dzdibinÄtÄjs ar vairÄkiem veiksmÄ«giem izgÄjieniem. Savu pirmo kompilatoru Klifs uzrakstÄ«ja 15 gadu vecumÄ (Pascal priekÅ” TRS Z-80)! ViÅÅ” ir vislabÄk pazÄ«stams ar savu darbu pie C2 Java (mezglu jÅ«rÄ IR). Å is kompilators pasaulei parÄdÄ«ja, ka JIT spÄj ražot augstas kvalitÄtes kodu, kas bija viens no faktoriem Java kÄ vienas no galvenajÄm mÅ«sdienu programmatÅ«ras platformÄm raÅ”anÄs. PÄc tam Klifs palÄ«dzÄja uzÅÄmumam Azul Systems izveidot 864 kodolu lieldatoru ar tÄ«ru Java programmatÅ«ru, kas 500 milisekundÄs atbalstÄ«ja GC pauzes 10 gigabaitu kaudzÄ«tÄ. KopumÄ Klifam izdevÄs strÄdÄt pie visiem JVM aspektiem.
Å is habraposts ir lieliska intervija ar Klifu. MÄs runÄsim par Å”ÄdÄm tÄmÄm:
PÄreja uz zema lÄ«meÅa optimizÄcijÄm
KÄ veikt lielu pÄrstrukturÄÅ”anu
Izmaksu modelis
Zema lÄ«meÅa optimizÄcijas apmÄcÄ«ba
Praktiski piemÄri veiktspÄjas uzlaboÅ”anai
KÄpÄc izveidot savu programmÄÅ”anas valodu
VeiktspÄjas inženiera karjera
Tehniskie izaicinÄjumi
Mazliet par reģistru pieŔķirŔanu un daudzkodolu
LielÄkais izaicinÄjums dzÄ«vÄ
Intervijas veic:
Andrejs Satarins no Amazon Web Services. SavÄ karjerÄ viÅam izdevÄs strÄdÄt pilnÄ«gi citos projektos: viÅÅ” testÄja NewSQL izplatÄ«to datu bÄzi Yandex, mÄkoÅu noteikÅ”anas sistÄmu Kaspersky Lab, vairÄku spÄlÄtÄju spÄli Mail.ru un pakalpojumu valÅ«tas cenu aprÄÄ·inÄÅ”anai Deutsche Bank. InteresÄ liela mÄroga aizmugursistÄmas un izplatÄ«to sistÄmu testÄÅ”ana.
Vladimirs SitÅikovs no Netcracker. Desmit gadu darbs pie NetCracker OS veiktspÄjas un mÄrogojamÄ«bas, programmatÅ«ras, ko telekomunikÄciju operatori izmanto tÄ«kla un tÄ«kla aprÄ«kojuma pÄrvaldÄ«bas procesu automatizÄÅ”anai. InteresÄ Java un Oracle Database veiktspÄjas problÄmas. Autors vairÄk nekÄ duci veiktspÄjas uzlabojumu oficiÄlajÄ PostgreSQL JDBC draiverÄ«.
PÄreja uz zema lÄ«meÅa optimizÄcijÄm
Andrejs: JÅ«s esat liels vÄrds JIT kompilÄcijas, Java un veiktspÄjas darba pasaulÄ kopumÄ, vai ne?
Klints: Tas ir tÄ!
Andrejs: SÄksim ar dažiem vispÄrÄ«giem jautÄjumiem par izpildes darbu. Ko jÅ«s domÄjat par izvÄli starp augsta lÄ«meÅa un zema lÄ«meÅa optimizÄcijÄm, piemÄram, darbu CPU lÄ«menÄ«?
Klints: JÄ, Å”eit viss ir vienkÄrÅ”i. ÄtrÄkais kods ir tas, kas nekad nedarbojas. TÄpÄc vienmÄr jÄsÄk no augsta lÄ«meÅa, jÄstrÄdÄ pie algoritmiem. LabÄks O apzÄ«mÄjums pÄrspÄs sliktÄku O apzÄ«mÄjumu, ja vien neiejauksies dažas pietiekami lielas konstantes. Zema lÄ«meÅa lietas paliek pÄdÄjÄs. Parasti, ja esat pietiekami labi optimizÄjis pÄrÄjo savu steku un joprojÄm ir palicis dažas interesantas lietas, tas ir zems lÄ«menis. Bet kÄ sÄkt no augsta lÄ«meÅa? KÄ zinÄt, ka ir paveikts pietiekami augsta lÄ«meÅa darbs? Nu... nekÄdÄ gadÄ«jumÄ. Gatavu recepÅ”u nav. Jums ir jÄsaprot problÄma, jÄizlemj, ko jÅ«s darÄ«sit (lai turpmÄk neveiktu nevajadzÄ«gas darbÄ«bas), un tad jÅ«s varat atklÄt profilÄtÄju, kas var pateikt kaut ko noderÄ«gu. KÄdÄ brÄ«dÄ« jÅ«s pats saprotat, ka esat atbrÄ«vojies no nevajadzÄ«gÄm lietÄm un ir pienÄcis laiks veikt zema lÄ«meÅa precizÄjumus. Tas noteikti ir Ä«paÅ”s mÄkslas veids. Ir daudz cilvÄku, kas dara nevajadzÄ«gas lietas, bet pÄrvietojas tik Ätri, ka viÅiem nav laika uztraukties par produktivitÄti. Bet tas ir lÄ«dz brÄ«dim, kad rodas jautÄjums. Parasti 99% gadÄ«jumu nevienam neinteresÄ tas, ko es daru, lÄ«dz brÄ«dim, kad uz kritiskÄ ceļa atnÄk kÄda svarÄ«ga lieta, kas nevienam nerÅ«p. Un Å”eit visi sÄk jÅ«s ÅurdÄt par to, "kÄpÄc tas jau no paÅ”a sÄkuma nedarbojÄs perfekti." KopumÄ sniegumÄ vienmÄr ir ko uzlabot. Bet 99% gadÄ«jumu jums nav potenciÄlo pirkumu! JÅ«s vienkÄrÅ”i mÄÄ£inÄt kaut ko panÄkt, un Å”ajÄ procesÄ jÅ«s saprotat, kas ir svarÄ«gi. Nekad nevar zinÄt iepriekÅ”, ka Å”im gabalam ir jÄbÅ«t perfektam, tÄpÄc patiesÄ«bÄ jÄbÅ«t perfektam it visÄ. Bet tas nav iespÄjams, un jÅ«s to nedariet. VienmÄr ir jÄlabo daudzas lietas ā un tas ir pilnÄ«gi normÄli.
KÄ veikt lielu pÄrstrukturÄÅ”anu
Andrejs: KÄ jÅ«s strÄdÄjat pie izrÄdes? TÄ ir transversÄla problÄma. PiemÄram, vai jums kÄdreiz ir nÄcies strÄdÄt pie problÄmÄm, kas rodas no daudzu esoÅ”o funkcionalitÄtes krustojuma?
Klints: Es cenÅ”os no tÄ izvairÄ«ties. Ja es zinu, ka veiktspÄja bÅ«s problÄma, es par to domÄju, pirms sÄku kodÄt, jo Ä«paÅ”i attiecÄ«bÄ uz datu struktÅ«rÄm. Bet bieži jÅ«s to visu atklÄjat ļoti vÄlÄk. Un tad ir jÄÄ·eras pie galÄjiem pasÄkumiem un jÄdara tas, ko es saucu par āpÄrrakstÄ«t un iekarotā: jÄpatver pietiekami liels gabals. Daļa koda joprojÄm bÅ«s jÄpÄrraksta veiktspÄjas problÄmu vai citu iemeslu dÄļ. NeatkarÄ«gi no koda pÄrrakstÄ«Å”anas iemesla gandrÄ«z vienmÄr ir labÄk pÄrrakstÄ«t lielÄku gabalu nekÄ mazÄku gabalu. Å ajÄ brÄ«dÄ« visi sÄk kratÄ«ties no bailÄm: "Ak, Dievs, tu nevari pieskarties tik daudz kodam!" Bet patiesÄ«bÄ Å”Ä« pieeja gandrÄ«z vienmÄr darbojas daudz labÄk. NekavÄjoties jÄuzÅemas liela problÄma, jÄnovelk ap to liels aplis un jÄsaka: es pÄrrakstÄ«Å”u visu apļa iekÅ”ienÄ. Apmale ir daudz mazÄka nekÄ saturs tajÄ, kas ir jÄnomaina. Un, ja Å”Äda robežu novilkÅ”ana ļauj perfekti paveikt darbu iekÅ”Ä, rokas ir brÄ«vas, dari, ko gribi. Kad esat sapratis problÄmu, pÄrrakstÄ«Å”anas process ir daudz vienkÄrÅ”Äks, tÄpÄc Åemiet vÄrÄ!
TajÄ paÅ”Ä laikÄ, kad veicat lielu pÄrrakstÄ«Å”anu un saprotat, ka veiktspÄja bÅ«s problÄma, varat nekavÄjoties sÄkt par to uztraukties. Tas parasti pÄrvÄrÅ”as par vienkÄrÅ”Äm lietÄm, piemÄram, ānekopÄjiet datus, pÄrvaldiet datus pÄc iespÄjas vienkÄrÅ”Äk, padariet tos mazusā. Lielos pÄrrakstÄ«jumos ir standarta veidi, kÄ uzlabot veiktspÄju. Un tie gandrÄ«z vienmÄr ir saistÄ«ti ar datiem.
Izmaksu modelis
Andrejs: vienÄ no aplÄdes apraidiem jÅ«s runÄjÄt par izmaksu modeļiem produktivitÄtes kontekstÄ. Vai varat paskaidrot, ko jÅ«s ar to domÄjÄt?
Klints: Noteikti. Esmu dzimis laikmetÄ, kad procesora veiktspÄja bija ÄrkÄrtÄ«gi svarÄ«ga. Un Å”is laikmets atkal atgriežas ā liktenis nav bez ironijas. Es sÄku dzÄ«vot astoÅu bitu maŔīnu laikos; mans pirmais dators strÄdÄja ar 256 baitiem. TieÅ”i baiti. Viss bija ļoti mazs. NorÄdÄ«jumi bija jÄskaita, un, kad mÄs sÄkÄm virzÄ«ties uz augÅ”u programmÄÅ”anas valodu kaudze, valodas ieguva arvien vairÄk. Bija Assembler, tad Basic, tad C, un C rÅ«pÄjÄs par daudzÄm detaļÄm, piemÄram, reÄ£istru pieŔķirÅ”anu un instrukciju atlasi. Bet tur viss bija diezgan skaidrs, un, ja es uzrÄdÄ«tu rÄdÄ«tÄju uz mainÄ«gÄ lieluma gadÄ«jumu, es iegÅ«tu slodzi, un Ŕīs instrukcijas izmaksas ir zinÄmas. AparatÅ«ra rada noteiktu skaitu maŔīnas ciklu, tÄpÄc dažÄdu lietu izpildes Ätrumu var aprÄÄ·inÄt, vienkÄrÅ”i saskaitot visas instrukcijas, kuras jÅ«s gatavojaties palaist. Katru salÄ«dzinÄjumu/pÄrbaudi/nozari/zvanu/ielÄdÄÅ”anu/veikalu var saskaitÄ«t un teikt: tas ir izpildes laiks jums. StrÄdÄjot pie veiktspÄjas uzlaboÅ”anas, noteikti pievÄrsÄ«siet uzmanÄ«bu tam, kÄdi skaitļi atbilst maziem karstajiem cikliem.
Bet, tiklÄ«dz jÅ«s pÄrejat uz Java, Python un lÄ«dzÄ«gÄm lietÄm, jÅ«s ļoti Ätri attÄlinÄsit no zema lÄ«meÅa aparatÅ«ras. Cik maksÄ getter izsaukÅ”ana Java? Ja HotSpot JIT ir pareiza iekļauts, tas tiks ielÄdÄts, bet, ja tas to nedarÄ«ja, tas bÅ«s funkcijas izsaukums. TÄ kÄ zvans notiek karstajÄ cilpÄ, tas ignorÄs visas pÄrÄjÄs optimizÄcijas Å”ajÄ ciklÄ. TÄpÄc reÄlÄs izmaksas bÅ«s daudz lielÄkas. Un jÅ«s uzreiz zaudÄjat iespÄju aplÅ«kot koda fragmentu un saprast, ka mums tas jÄizpilda procesora takts Ätruma, atmiÅas un izmantotÄs keÅ”atmiÅas ziÅÄ. Tas viss kļūst interesants tikai tad, ja izrÄdÄ patieÅ”Äm iekļūsti.
Tagad mÄs atrodamies situÄcijÄ, kad procesora Ätrums gandrÄ«z nav palielinÄjies desmit gadus. Vecie laiki ir atgriezuÅ”ies! JÅ«s vairs nevarat paļauties uz labu viena vÄ«tnes veiktspÄju. Bet, ja pÄkÅ”Åi nokļūstat paralÄlajÄ skaitļoÅ”anÄ, tas ir neticami grÅ«ti, visi uz jums skatÄs kÄ uz Džeimsu Bondu. DesmitkÄrtÄ«gi paÄtrinÄjumi Å”eit parasti notiek vietÄs, kur kÄds kaut ko ir saputrojis. VienlaicÄ«ba prasa daudz darba. Lai iegÅ«tu Å”o XNUMXx paÄtrinÄjumu, jums ir jÄsaprot izmaksu modelis. Kas un cik tas maksÄ? Un, lai to izdarÄ«tu, jums ir jÄsaprot, kÄ mÄle pieguļ pamatÄ esoÅ”ajai aparatÅ«rai.
Martins Tompsons savam emuÄram izvÄlÄjÄs lielisku vÄrdu MehÄniskÄ simpÄtija! Jums ir jÄsaprot, ko aparatÅ«ra darÄ«s, kÄ tieÅ”i tÄ to darÄ«s un kÄpÄc tÄ dara to, ko tÄ dara. Izmantojot to, ir diezgan viegli sÄkt skaitÄ«t norÄdÄ«jumus un izdomÄt, kur paiet izpildes laiks. Ja jums nav atbilstoÅ”as āāapmÄcÄ«bas, jÅ«s vienkÄrÅ”i meklÄjat melnu kaÄ·i tumÅ”Ä telpÄ. Es redzu cilvÄkus, kas visu laiku optimizÄ veiktspÄju un kuriem nav ne jausmas, ko viÅi dara. ViÅi daudz cieÅ” un negÅ«st lielu progresu. Un, kad es paÅemu to paÅ”u koda fragmentu, ieslÄ«dÄju pÄris mazos uzlauÅ”anas un paÄtrinu piecas vai desmit reizes, viÅi saka: nu, tas nav godÄ«gi, mÄs jau zinÄjÄm, ka tu esi labÄks. ApbrÄ«nojami. Par ko es runÄju... izmaksu modelis ir par to, kÄdu kodu tu raksti un cik Ätri tas darbojas vidÄji lielajÄ attÄlÄ.
Andrejs: Un kÄ var noturÄt galvÄ tÄdu apjomu? Vai tas tiek panÄkts ar lielÄku pieredzi, vai? No kurienes tÄda pieredze?
Klints: Nu, es nesaÅÄmu savu pieredzi vieglÄkajÄ veidÄ. Es ieprogrammÄju Assembly tajos laikos, kad jÅ«s varÄjÄt saprast katru instrukciju. Stulbi izklausÄs, bet kopÅ” tÄ laika Z80 instrukciju komplekts vienmÄr ir palicis galvÄ, atmiÅÄ. Es neatceros cilvÄku vÄrdus minÅ«tes laikÄ pÄc sarunas, bet atceros kodu, kas rakstÄ«ts pirms 40 gadiem. Tas ir smieklÄ«gi, tas izskatÄs pÄc sindroma"idiots zinÄtnieks'.
Zema lÄ«meÅa optimizÄcijas apmÄcÄ«ba
Andrejs: Vai ir kÄds vieglÄks veids, kÄ iekļūt?
Klints: JÄ un nÄ. AparatÅ«ra, ko mÄs visi izmantojam, laika gaitÄ nav tik daudz mainÄ«jusies. Visi izmanto x86, izÅemot Arm viedtÄlruÅus. Ja jÅ«s neveicat kaut kÄdu stingru iegulÅ”anu, jÅ«s darÄt to paÅ”u. Labi, nÄkamais. Instrukcijas arÄ« nav mainÄ«juÅ”Äs gadsimtiem ilgi. Jums jÄiet un jÄieraksta kaut kas AsamblejÄ. Nav daudz, bet pietiekami, lai sÄktu saprast. JÅ«s smaidÄt, bet es runÄju pilnÄ«gi nopietni. Jums ir jÄsaprot valodas un aparatÅ«ras atbilstÄ«ba. PÄc tam jums jÄiet un jÄraksta nedaudz un jÄuztaisa rotaļlietu kompilators mazai rotaļlietu valodai. Rotaļlietai lÄ«dzÄ«gais nozÄ«mÄ, ka tÄ ir jÄizgatavo saprÄtÄ«gÄ laika posmÄ. Tas var bÅ«t ļoti vienkÄrÅ”s, taÄu tam ir jÄÄ£enerÄ norÄdÄ«jumi. Instrukcijas Ä£enerÄÅ”ana palÄ«dzÄs izprast izmaksu modeli tiltam starp augsta lÄ«meÅa kodu, ko visi raksta, un maŔīnas kodu, kas darbojas aparatÅ«rÄ. Å Ä« sarakste tiks sadedzinÄta smadzenÄs kompilatora rakstÄ«Å”anas laikÄ. Pat visvienkÄrÅ”Äkais kompilators. PÄc tam var sÄkt skatÄ«ties uz Java un to, ka tÄs semantiskÄ plaisa ir daudz dziļÄka, un tiltus pÄri bÅ«vÄt ir daudz grÅ«tÄk. Java valodÄ ir daudz grÅ«tÄk saprast, vai mÅ«su tilts izrÄdÄ«jÄs labs vai slikts, kas liks tam sabrukt un kas nÄ. Bet jums ir nepiecieÅ”ams kaut kÄds sÄkumpunkts, kurÄ jÅ«s skatÄties uz kodu un saprotat: "jÄ, Å”is dabÅ«tÄjs ir jÄiekļauj katru reizi." Un tad izrÄdÄs, ka dažreiz tas notiek, izÅemot gadÄ«jumu, kad metode kļūst pÄrÄk liela, un JIT sÄk visu iekļaut. Å Ädu vietu sniegumu var paredzÄt uzreiz. Parasti getteri darbojas labi, bet tad jÅ«s skatÄties uz lielÄm karstajÄm cilpÄm un saprotat, ka tur plÅ«st daži funkciju izsaukumi, kas nezina, ko viÅi dara. TÄ ir problÄma ar plaÅ”i izplatÄ«to getteru izmantoÅ”anu, iemesls, kÄpÄc tie nav iekļauti, ir tas, ka nav skaidrs, vai tie ir getteri. Ja jums ir ļoti maza koda bÄze, varat to vienkÄrÅ”i atcerÄties un pÄc tam pateikt: Å”is ir ieguvÄjs, un Å”is ir iestatÄ«tÄjs. LielajÄ kodu bÄzÄ katra funkcija dzÄ«vo savu vÄsturi, kas kopumÄ nevienam nav zinÄma. ProfilÄtÄjs saka, ka mÄs zaudÄjÄm 24% laika kÄdÄ cilpÄ, un, lai saprastu, ko Ŕī cilpa dara, mums ir jÄaplÅ«ko katra funkcija iekÅ”pusÄ. To nav iespÄjams saprast, neizpÄtot funkciju, un tas nopietni palÄnina izpratnes procesu. TÄpÄc es neizmantoju getterus un seterus, esmu sasniedzis jaunu lÄ«meni!
Kur iegÅ«t izmaksu modeli? Nu ko, protams, var izlasÄ«t... Bet es domÄju, ka vislabÄkais veids ir rÄ«koties. Neliela kompilatora izveide bÅ«s labÄkais veids, kÄ izprast izmaksu modeli un iekļaut to savÄ galvÄ. Neliels kompilators, kas bÅ«tu piemÄrots mikroviļÅu programmÄÅ”anai, ir iesÄcÄja uzdevums. Nu, es domÄju, ja jums jau ir programmÄÅ”anas prasmes, tad ar to vajadzÄtu pietikt. Visas Ŕīs lietas, piemÄram, virknes parsÄÅ”ana, kas jums ir kÄ sava veida algebriskÄ izteiksme, matemÄtisko darbÄ«bu instrukciju izvilkÅ”ana no turienes pareizÄ secÄ«bÄ, pareizo vÄrtÄ«bu ÅemÅ”ana no reÄ£istriem - tas viss tiek darÄ«ts uzreiz. Un, kamÄr jÅ«s to darÄ«sit, tas tiks ierakstÄ«ts jÅ«su smadzenÄs. Es domÄju, ka visi zina, ko dara kompilators. Un tas sniegs izpratni par izmaksu modeli.
Praktiski piemÄri veiktspÄjas uzlaboÅ”anai
Andrejs: Kam vÄl bÅ«tu jÄpievÄrÅ” uzmanÄ«ba, strÄdÄjot pie produktivitÄtes?
Klints: Datu struktÅ«ras. Starp citu, jÄ, es jau sen neesmu mÄcÄ«jis Ŕīs nodarbÄ«bas... RaÄ·eÅ”u skola. Tas bija jautri, bet tas prasÄ«ja daudz pūļu, un man arÄ« ir dzÄ«ve! LABI. TÄpÄc vienÄ no lielajÄm un interesantajÄm nodarbÄ«bÄm āKur paliek jÅ«su sniegumsā es studentiem sniedzu piemÄru: no CSV faila tika nolasÄ«ti divarpus gigabaiti fintech datu, un pÄc tam viÅiem bija jÄaprÄÄ·ina pÄrdoto produktu skaits. . RegulÄri ÄrÄu tirgus dati. UDP paketes, kas pÄrveidotas teksta formÄtÄ kopÅ” 70. gadiem. ÄikÄgas preÄu birža ā visÄdas lietas, piemÄram, sviests, kukurÅ«za, sojas pupiÅas, tÄdas lietas. VajadzÄja saskaitÄ«t Å”os produktus, darÄ«jumu skaitu, vidÄjo naudas lÄ«dzekļu un preÄu kustÄ«bas apjomu utt. TÄ ir diezgan vienkÄrÅ”a tirdzniecÄ«bas matemÄtika: atrodiet produkta kodu (tas ir 1ā2 rakstzÄ«mes hash tabulÄ), iegÅ«stiet summu, pievienojiet to vienai no tirdzniecÄ«bas kopÄm, pievienojiet apjomu, pievienojiet vÄrtÄ«bu un dažas citas lietas. Ä»oti vienkÄrÅ”a matemÄtika. Rotaļlietas realizÄcija bija ļoti vienkÄrÅ”a: viss ir failÄ, es izlasu failu un pÄrvietojos pa to, sadalot atseviŔķus ierakstus Java virknÄs, meklÄjot tajÄs nepiecieÅ”amÄs lietas un saskaitot tos pÄc iepriekÅ” aprakstÄ«tÄs matemÄtikas. Un tas darbojas ar nelielu Ätrumu.
Izmantojot Å”o pieeju, ir skaidrs, kas notiek, un paralÄlÄ skaitļoÅ”ana nepalÄ«dzÄs, vai ne? IzrÄdÄs, ka pieckÄrtÄ«gu veiktspÄjas pieaugumu var panÄkt, 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Ä triks bija tÄds, ka nevajadzÄtu veikt atmiÅas pieŔķirÅ”anu karstÄ cilpÄ. Nu, tÄ nav visa patiesÄ«ba, bet kopumÄ - nevajadzÄtu izcelt āvienu reizi Xā, ja X ir pietiekami liels. Ja X ir divarpus gigabaiti, jums nevajadzÄtu pieŔķirt neko āvienu reizi burtÄā, āvienu reizi rindÄā, vai āvienu reizi laukÄā, kaut ko tamlÄ«dzÄ«gu. Å eit tiek pavadÄ«ts laiks. KÄ tas vispÄr darbojas? IedomÄjieties, ka es zvanu String.split() vai BufferedReader.readLine(). Readline izveido virkni no baitu kopas, kas tika saÅemta tÄ«klÄ, vienu reizi katrai rindai, katrai no simtiem miljonu lÄ«niju. Es paÅemu Å”o lÄ«niju, parsÄju un izmetu. KÄpÄc es to izmetu - labi, es to jau esmu apstrÄdÄjis, tas arÄ« viss. TÄtad katram baitam, kas nolasÄ«ts no Å”iem 2.7G, rindÄ tiks ierakstÄ«tas divas rakstzÄ«mes, tas ir, jau 5.4G, un man tÄs vairs nekam nevajag, tÄpÄc tiek izmestas. Ja paskatÄs uz atmiÅas joslas platumu, mÄs ielÄdÄjam 2.7 G, kas iet caur atmiÅu un atmiÅas kopni procesorÄ, un tad divreiz vairÄk tiek nosÅ«tÄ«ts uz atmiÅÄ esoÅ”o lÄ«niju, un tas viss tiek nobružÄts, veidojot katru jaunu lÄ«niju. Bet man tas ir jÄizlasa, aparatÅ«ra to nolasa, pat ja vÄlÄk viss ir nobružÄts. Un man tas ir jÄpieraksta, jo izveidoju rindiÅu un keÅ”atmiÅas ir pilnas - keÅ”atmiÅÄ nevar ievietot 2.7G. TÄtad, par katru izlasÄ«to baitu es nolasu vÄl divus baitus un uzrakstu vÄl divus baitus, un galu galÄ tiem ir attiecÄ«ba 4:1 - Å”ajÄ attiecÄ«bÄ mÄs tÄrÄjam atmiÅas joslas platumu. Un tad izrÄdÄs, ka, ja es to darÄ«Å”u String.split() ā Ŕī nav pÄdÄjÄ reize, kad to daru, iekÅ”Ä var bÅ«t vÄl kÄdi 6-7 lauki. TÄtad klasiskais kods, nolasot CSV un pÄc tam parsÄjot virknes, rada atmiÅas joslas platuma zudumu aptuveni 14:1 attiecÄ«bÄ pret to, ko jÅ«s patiesÄ«bÄ vÄlÄtos. Izmetot Ŕīs izlases, varat iegÅ«t pieckÄrtÄ«gu Ätrumu.
Un tas nav nemaz tik grÅ«ti. Ja paskatÄs uz kodu no pareizÄ leÅÄ·a, tas viss kļūst pavisam vienkÄrÅ”i, tiklÄ«dz jÅ«s saprotat problÄmu. Jums nevajadzÄtu pilnÄ«bÄ pÄrtraukt atmiÅas pieŔķirÅ”anu: vienÄ«gÄ problÄma ir tÄ, ka jÅ«s pieŔķirat kaut ko, un tas nekavÄjoties nomirst, un pa ceļam tas sadedzina svarÄ«gu resursu, kas Å”ajÄ gadÄ«jumÄ ir atmiÅas joslas platums. Un tas viss noved pie produktivitÄtes krituma. Uz x86 jums parasti ir nepiecieÅ”ams aktÄ«vi ierakstÄ«t procesora ciklus, bet Å”eit jÅ«s sadedzinÄjÄt visu atmiÅu daudz agrÄk. RisinÄjums ir samazinÄt izdalÄ«jumu daudzumu.
Otra problÄmas daļa ir tÄda, ka, ja palaižat profilÄtÄju, kad beidzas atmiÅas josla, tieÅ”i tad, kad tas notiek, jÅ«s parasti gaidÄt, kad keÅ”atmiÅa atgriezÄ«sies, jo tÄ ir pilna ar tikko radÄ«tajiem atkritumiem, visas Ŕīs rindas. LÄ«dz ar to katra ielÄde vai veikala darbÄ«ba kļūst lÄna, jo tÄs noved pie keÅ”atmiÅas izlaiÅ”anas ā visa keÅ”atmiÅa ir kļuvusi lÄna, gaidot, kad to pametÄ«s atkritumi. TÄpÄc profilÄtÄjs tikai rÄdÄ«s siltu nejauÅ”u troksni, kas izsmÄrÄts visÄ cilpÄ - nebÅ«s atseviŔķas karstÄs instrukcijas vai vietas kodÄ. Tikai troksnis. Un, ja paskatÄs uz GC ciklus, tie visi ir JaunÄs paaudzes un Ä«paÅ”i Ätri - mikrosekundes vai milisekundes maksimums. Galu galÄ visa Ŕī atmiÅa nomirst uzreiz. JÅ«s pieŔķirat miljardus gigabaitu, un viÅÅ” tos sagriež, sagriež un vÄlreiz. Tas viss notiek ļoti Ätri. IzrÄdÄs, ka ir lÄti GC cikli, silts troksnis visa cikla garumÄ, bet gribam dabÅ«t 5x paÄtrinÄjumu. Å ajÄ brÄ«dÄ« kaut kam vajadzÄtu aizvÄrties galvÄ un skanÄt: "kÄpÄc tas ir?!" AtmiÅas joslas pÄrpilde netiek rÄdÄ«ta klasiskajÄ atkļūdotÄjs; jums ir jÄpalaiž aparatÅ«ras veiktspÄjas skaitÄ«tÄja atkļūdotÄjs un jÄredz tas pats un tieÅ”i. Bet no Å”iem trim simptomiem to nevar tieÅ”i aizdomÄties. TreÅ”ais simptoms ir, kad paskatÄs uz izcelto, pajautÄ profilÄtÄjam, un viÅÅ” atbild: "JÅ«s izveidojÄt miljardu rindu, bet GC strÄdÄja bez maksas." TiklÄ«dz tas notiek, jÅ«s saprotat, ka esat izveidojis pÄrÄk daudz objektu un sadedzinÄjis visu atmiÅas joslu. Ir veids, kÄ to noskaidrot, bet tas nav acÄ«mredzams.
ProblÄma ir datu struktÅ«rÄ: visa notiekoÅ”Ä pamatÄ esoÅ”Ä tukÅ”Ä struktÅ«ra ir pÄrÄk liela, diskÄ ir 2.7G, tÄpÄc Ŕīs lietas kopÄÅ”ana ir ļoti nevÄlama - jÅ«s vÄlaties to nekavÄjoties ielÄdÄt no tÄ«kla baitu bufera. reÄ£istros, lai piecas reizes nelasÄ«tu-rakstu uz rindu uz priekÅ”u un atpakaļ. DiemžÄl Java pÄc noklusÄjuma nepieŔķir jums Å”Ädu bibliotÄku kÄ daļu no JDK. Bet tas ir triviÄli, vai ne? BÅ«tÄ«bÄ tÄs ir 5ā10 koda rindiÅas, kas tiks izmantotas, lai ieviestu jÅ«su buferizÄto virkÅu ielÄdÄtÄju, kas atkÄrto virkÅu klases darbÄ«bu, vienlaikus apgÅ«stot pamatÄ esoÅ”o baitu buferi. RezultÄtÄ izrÄdÄs, ka jÅ«s strÄdÄjat gandrÄ«z kÄ ar virknÄm, bet patiesÄ«bÄ tur pÄrvietojas norÄdes uz buferi, un neapstrÄdÄtie baiti nekur netiek kopÄti, un lÄ«dz ar to tie paÅ”i buferi tiek izmantoti atkal un atkal, un operÄtÄjsistÄma labprÄt uzÅemas lietas, kurÄm tÄ ir paredzÄta, piemÄram, Å”o baitu buferu slÄpto dubulto buferizÄciju, un jÅ«s vairs negraužat nevajadzÄ«gu datu bezgalÄ«gu straumi. Starp citu, vai jÅ«s saprotat, ka strÄdÄjot ar GC, tiek garantÄts, ka katrs atmiÅas sadalÄ«jums pÄc pÄdÄjÄ GC cikla nebÅ«s redzams procesoram? TÄpÄc tas viss nevar bÅ«t keÅ”atmiÅÄ, un tad notiek 100% garantÄta garÄm. StrÄdÄjot ar rÄdÄ«tÄju x86, reÄ£istra atÅemÅ”ana no atmiÅas aizÅem 1-2 pulksteÅa ciklus, un tiklÄ«dz tas notiek, jÅ«s maksÄjat, maksÄjat, maksÄjat, jo atmiÅa ir ieslÄgta DEVIÅ AS keÅ”atmiÅas ā un tÄs ir atmiÅas pieŔķirÅ”anas izmaksas. ReÄlÄ vÄrtÄ«ba.
Citiem vÄrdiem sakot, visgrÅ«tÄk ir mainÄ«t datu struktÅ«ras. Un, tiklÄ«dz jÅ«s saprotat, ka esat izvÄlÄjies nepareizu datu struktÅ«ru, kas vÄlÄk samazinÄs veiktspÄju, parasti ir daudz darÄmÄ, taÄu, ja jÅ«s to nedarÄ«sit, viss pasliktinÄsies. PirmkÄrt, jums ir jÄdomÄ par datu struktÅ«rÄm, tas ir svarÄ«gi. GalvenÄs izmaksas Å”eit attiecas uz resnajÄm datu struktÅ«rÄm, kuras sÄk izmantot stilÄ āEs nokopÄju datu struktÅ«ru X datu struktÅ«rÄ Y, jo man labÄk patÄ«k Y formaā. TaÄu kopÄÅ”anas darbÄ«ba (kas Ŕķiet lÄta) faktiski izŔķiež atmiÅas joslas platumu, un tur tiek aprakts viss izŔķÄrdÄtais izpildes laiks. Ja man ir milzÄ«ga JSON virkne un es vÄlos to pÄrvÄrst par strukturÄtu POJO DOM koku vai kaut ko citu, Ŕīs virknes parsÄÅ”ana un POJO izveidoÅ”ana un pÄc tam atkal piekļūŔana POJO vÄlÄk radÄ«s nevajadzÄ«gas izmaksas ā tas ir. nav lÄts. IzÅemot gadÄ«jumus, kad jÅ«s daudz biežÄk skraidÄt ap POJO, nevis ap virkni. TÄ vietÄ varat mÄÄ£inÄt atÅ”ifrÄt virkni un iegÅ«t no turienes tikai to, kas jums nepiecieÅ”ams, nepÄrvÄrÅ”ot to par POJO. Ja tas viss notiek uz ceļa, no kura ir nepiecieÅ”ama maksimÄla veiktspÄja, jums nav POJO, jums ir kaut kÄ jÄieraksta lÄ«nija tieÅ”i.
KÄpÄc izveidot savu programmÄÅ”anas valodu
Andrejs: JÅ«s teicÄt, ka, lai saprastu izmaksu modeli, jums ir jÄraksta sava mazÄ valoda...
Klints: Nevis valoda, bet kompilators. Valoda un kompilators ir divas dažÄdas lietas. VissvarÄ«gÄkÄ atŔķirÄ«ba ir jÅ«su galvÄ.
Andrejs: Starp citu, cik man zinÄms, jÅ«s eksperimentÄjat ar savu valodu radÄ«Å”anu. Par ko?
Klints: Jo es varu! Esmu daļÄji pensijÄ, tÄpÄc tas ir mans hobijs. Es visu mūžu esmu ieviesis citu cilvÄku valodas. Es arÄ« daudz strÄdÄju pie sava kodÄÅ”anas stila. Un arÄ« tÄpÄc, ka redzu problÄmas citÄs valodÄs. Es redzu, ka ir labÄki veidi, kÄ darÄ«t pazÄ«stamas lietas. Un es tos izmantotu. Man vienkÄrÅ”i ir apnicis redzÄt problÄmas sevÄ«, Java, Python, jebkurÄ citÄ valodÄ. Es tagad rakstu React Native, JavaScript un Elm kÄ hobiju, kas nav saistÄ«ts ar pensionÄÅ”anos, bet gan par aktÄ«vu darbu. Es arÄ« rakstu Python un, visticamÄk, turpinÄÅ”u strÄdÄt pie maŔīnmÄcÄ«Å”anÄs Java aizmugursistÄmai. Ir daudz populÄru valodu, un tÄm visÄm ir interesantas funkcijas. Katrs ir labs savÄ veidÄ, un jÅ«s varat mÄÄ£inÄt apvienot visas Ŕīs funkcijas. TÄtad, es studÄju lietas, kas mani interesÄ, valodas uzvedÄ«bu, mÄÄ£inu izdomÄt saprÄtÄ«gu semantiku. Un pagaidÄm man tas izdodas! Å obrÄ«d cÄ«nos ar atmiÅas semantiku, jo gribu, lai tÄ bÅ«tu kÄ C un Java, un dabÅ«tu spÄcÄ«gu atmiÅas modeli un atmiÅas semantiku ielÄdÄÅ”anai un veikaliem. TajÄ paÅ”Ä laikÄ izmantojiet automÄtisku tipa secinÄjumu, piemÄram, Haskell. Å eit es mÄÄ£inu sajaukt Haskell tipa secinÄjumus ar atmiÅas darbu gan C, gan Java. TÄ es, piemÄram, daru pÄdÄjos 2-3 mÄneÅ”us.
Andrejs: Ja jÅ«s veidojat valodu, kas pÄrÅem labÄkus aspektus no citÄm valodÄm, vai jÅ«s domÄjat, ka kÄds darÄ«s pretÄjo: Åems jÅ«su idejas un izmantos tÄs?
Klints: TieÅ”i Å”Ädi parÄdÄs jaunas valodas! KÄpÄc Java ir lÄ«dzÄ«ga C? TÄ kÄ C bija laba sintakse, ko visi saprata, un Java iedvesmoja Ŕī sintakse, pievienojot veidu droŔību, masÄ«vu robežu pÄrbaudi, GC, un viÅi arÄ« uzlaboja dažas lietas no C. ViÅi pievienoja savas. Bet viÅi bija diezgan iedvesmoti, vai ne? Ikviens stÄv uz to milžu pleciem, kuri bija pirms jums - tÄ tiek panÄkts progress.
Andrejs: KÄ es saprotu, jÅ«su valoda bÅ«s droÅ”a. Vai esat domÄjis par tÄdas lietas ievieÅ”anu kÄ aizÅemties pÄrbaudÄ«tÄju no Rust? Vai esi uz viÅu skatÄ«jies, ko tu par viÅu domÄ?
Klints: Nu, es esmu rakstÄ«jis C jau daudzus gadus, izmantojot visu Å”o malloc un bezmaksas, un manuÄli pÄrvaldot visu mūžu. JÅ«s zinÄt, 90-95% no manuÄli kontrolÄtÄ dzÄ«ves laika ir tÄda pati struktÅ«ra. Un tas ir ļoti, ļoti sÄpÄ«gi to darÄ«t manuÄli. GribÄtos, lai sastÄdÄ«tÄjs vienkÄrÅ”i pastÄsta, kas tur notiek un ko ar savÄm darbÄ«bÄm panÄcÄt. DažÄm lietÄm aizÅÄmumu pÄrbaudÄ«tÄjs to dara jau no kastes. Un tai vajadzÄtu automÄtiski parÄdÄ«t informÄciju, saprast visu un pat neapgrÅ«tinÄt mani ar Ŕīs izpratnes pasniegÅ”anu. Tai ir jÄveic vismaz lokÄlÄ aizbÄgÅ”anas analÄ«ze, un tikai tad, ja tÄ neizdodas, tai ir jÄpievieno tipa anotÄcijas, kas apraksta kalpoÅ”anas laiku - un Å”Äda shÄma ir daudz sarežģītÄka nekÄ aizÅemÅ”anÄs pÄrbaudÄ«tÄjs vai jebkurÅ” esoÅ”ais atmiÅas pÄrbaudÄ«tÄjs. IzvÄle starp āviss ir kÄrtÄ«bÄā un āEs neko nesaprotuā - nÄ, ir jÄbÅ«t kaut kam labÄkam.
TÄpÄc kÄ cilvÄks, kurÅ” ir uzrakstÄ«jis daudz koda C valodÄ, es domÄju, ka vissvarÄ«gÄkais ir atbalsts automÄtiskai mūža kontrolei. Man arÄ« ir apnicis, cik daudz Java izmanto atmiÅu, un galvenÄ sÅ«dzÄ«ba ir GC. PieŔķirot atmiÅu Java, jÅ«s neatgÅ«sit atmiÅu, kas bija vietÄjÄ pÄdÄjÄ GC ciklÄ. Tas tÄ nav valodÄs ar precÄ«zÄku atmiÅas pÄrvaldÄ«bu. Ja zvanÄt malloc, jÅ«s nekavÄjoties iegÅ«sit atmiÅu, kas parasti tika izmantota. Parasti jÅ«s veicat dažas pagaidu darbÄ«bas ar atmiÅu un nekavÄjoties atdodat to atpakaļ. Un tas nekavÄjoties atgriežas malloc baseinÄ, un nÄkamais malloc cikls to atkal izvelk. TÄpÄc faktiskais atmiÅas lietojums tiek samazinÄts lÄ«dz dzÄ«vo objektu kopumam noteiktÄ laikÄ, kÄ arÄ« noplÅ«dÄm. Un, ja viss nenoplÅ«st pilnÄ«gi nepiedienÄ«gÄ veidÄ, lielÄkÄ daļa atmiÅas nonÄk keÅ”atmiÅÄ un procesorÄ, un tas darbojas Ätri. Bet prasa daudz manuÄlas atmiÅas pÄrvaldÄ«bas ar malloc un bezmaksas zvanu pareizajÄ secÄ«bÄ, Ä«stajÄ vietÄ. RÅ«sa var pareizi tikt galÄ ar to un daudzos gadÄ«jumos nodroÅ”ina vÄl labÄku veiktspÄju, jo atmiÅas patÄriÅÅ” tiek samazinÄts lÄ«dz paÅ”reizÄjam aprÄÄ·inam, nevis gaidÄ«t nÄkamo GC ciklu, lai atbrÄ«votu atmiÅu. RezultÄtÄ mÄs ieguvÄm ļoti interesantu veidu, kÄ uzlabot veiktspÄju. Un diezgan jaudÄ«gs ā es domÄju, es darÄ«ju Å”Ädas darbÄ«bas, apstrÄdÄjot fintech datus, un tas ļÄva man paÄtrinÄt apmÄram piecas reizes. Tas ir diezgan liels stimuls, it Ä«paÅ”i pasaulÄ, kur procesori nekļūst ÄtrÄki un mÄs joprojÄm gaidÄm uzlabojumus.
VeiktspÄjas inženiera karjera
Andrejs: VÄlos pajautÄt arÄ« par karjeru kopumÄ. JÅ«s ieguvÄt ievÄrojamu vietu ar savu JIT darbu HotSpot un pÄc tam pÄrcÄlÄties uz Azul, kas arÄ« ir JVM uzÅÄmums. Bet mÄs jau vairÄk strÄdÄjÄm pie aparatÅ«ras, nevis programmatÅ«ras. Un tad viÅi pÄkÅ”Åi pÄrgÄja uz lielo datu un maŔīnmÄcÄ«Å”anos un pÄc tam uz krÄpÅ”anas atklÄÅ”anu. KÄ tas notika? TÄs ir ļoti dažÄdas attÄ«stÄ«bas jomas.
Klints: Es programmÄju diezgan ilgu laiku, un man ir izdevies apmeklÄt daudzas dažÄdas nodarbÄ«bas. Un, kad cilvÄki saka: āAk, tu esi tas, kurÅ” veica JIT priekÅ” Java!ā, tas vienmÄr ir smieklÄ«gi. Bet pirms tam es strÄdÄju pie PostScript klona ā valodas, ko Apple savulaik izmantoja saviem lÄzerprinteriem. Un pirms tam es ieviesu Forth valodu. ManuprÄt, kopÄjÄ tÄma man ir rÄ«ku izstrÄde. Visu mūžu esmu veidojis rÄ«kus, ar kuriem citi raksta savas forÅ”Äs programmas. Bet es piedalÄ«jos arÄ« operÄtÄjsistÄmu, draiveru, kodola lÄ«meÅa atkļūdotÄju, OS izstrÄdes valodu izstrÄdÄ, kas sÄkÄs triviÄli, bet laika gaitÄ kļuva arvien sarežģītÄka. Bet galvenÄ tÄma joprojÄm ir instrumentu izstrÄde. Liela daļa manas dzÄ«ves pagÄja starp Azul un Sun, un tÄ bija par Java. Bet, kad es iesaistÄ«jos Big Data un Machine Learning, es atkal uzliku savu izdomÄto cepuri un teicu: "Ak, tagad mums ir nenozÄ«mÄ«ga problÄma, un notiek daudz interesantu lietu un cilvÄki dara lietas." Tas ir lielisks attÄ«stÄ«bas ceļŔ.
JÄ, man ļoti patÄ«k izplatÄ«ta skaitļoÅ”ana. Mans pirmais darbs bija kÄ students C, pie reklÄmas projekta. Tas tika izplatÄ«ts, izmantojot Zilog Z80 mikroshÄmas, kas apkopoja datus analogajam OCR, ko ražo reÄls analogais analizators. TÄ bija forÅ”a un pilnÄ«gi traka tÄma. Bet bija problÄmas, kÄda daļa netika pareizi atpazÄ«ta, tÄpÄc bija jÄizÅem bilde un jÄparÄda cilvÄkam, kurÅ” jau varÄja lasÄ«t ar acÄ«m un ziÅot par to, un tÄpÄc bija darbi ar datiem, un Å”ie darbi bija sava valoda. Bija aizmugure, kas to visu apstrÄdÄja - Z80s darbojÄs paralÄli ar vt100 terminÄļiem, kas darbojas - viens uz cilvÄku, un Z80 bija paralÄlas programmÄÅ”anas modelis. Dažas kopÄ«gas atmiÅas daļas, ko koplieto visi Z80 zvaigznÄ«tes konfigurÄcijÄ; ArÄ« aizmugurÄjÄ plakne tika koplietota, un puse no RAM tika koplietota tÄ«klÄ, bet vÄl viena puse bija privÄta vai tika izmantota kaut kam citam. Sarežģīta paralÄli sadalÄ«ta sistÄma ar koplietotu... daļÄji koplietotu atmiÅu. Kad tas bija... Es pat neatceros, kaut kur 80. gadu vidÅ«. Diezgan sen.
JÄ, pieÅemsim, ka 30 gadi ir diezgan sen. ProblÄmas, kas saistÄ«tas ar izkliedÄto skaitļoÅ”anu, pastÄv jau diezgan ilgu laiku, cilvÄki jau sen karo ar Beowulf-kopas. TÄdi klasteri izskatÄs... PiemÄram: ir Ethernet un tavs Ätrais x86 ir pieslÄgts Å”im Ethernet, un tagad gribi dabÅ«t viltus koplietojamo atmiÅu, jo toreiz neviens nevarÄja veikt dalÄ«to skaitļoÅ”anas kodÄÅ”anu, tas bija pÄrÄk grÅ«ti un tÄpÄc tur bija viltota koplietojamÄ atmiÅa ar aizsardzÄ«bas atmiÅas lapÄm uz x86, un, ja jÅ«s rakstÄ«jÄt uz Å”o lapu, tad mÄs teicÄm citiem procesoriem, ka, ja viÅi piekļūs tai paÅ”ai koplietotajai atmiÅai, tÄ bÅ«s jÄielÄdÄ no jums, un tÄdÄjÄdi kaut kas lÄ«dzÄ«gs atbalsta protokolam. parÄdÄ«jÄs keÅ”atmiÅas saskaÅotÄ«ba un programmatÅ«ra tam. Interesants koncepts. PatiesÄ problÄma, protams, bija kas cits. Tas viss nostrÄdÄja, taÄu Ätri radÄs veiktspÄjas problÄmas, jo neviens nesaprata veiktspÄjas modeļus pietiekami labÄ lÄ«menÄ« ā kÄdi tur ir atmiÅas piekļuves modeļi, kÄ nodroÅ”inÄt, lai mezgli bezgalÄ«gi neping viens otru utt.
Tas, ko es izdomÄju H2O, ir tas, ka paÅ”i izstrÄdÄtÄji ir atbildÄ«gi par to, lai noteiktu, kur paralÄlisms ir paslÄpts un kur tas nav. Es izdomÄju kodÄÅ”anas modeli, kas padarÄ«ja augstas veiktspÄjas koda rakstÄ«Å”anu vieglu un vienkÄrÅ”u. Bet rakstÄ«t lÄni darbojoÅ”os kodu ir grÅ«ti, tas izskatÄ«sies slikti. Jums nopietni jÄmÄÄ£ina rakstÄ«t lÄnu kodu, jums bÅ«s jÄizmanto nestandarta metodes. BremzÄÅ”anas kods ir redzams no pirmÄ acu uzmetiena. TÄ rezultÄtÄ parasti tiek rakstÄ«ts kods, kas darbojas Ätri, bet jums ir jÄizdomÄ, ko darÄ«t koplietojamÄs atmiÅas gadÄ«jumÄ. Tas viss ir saistÄ«ts ar lieliem masÄ«viem, un tur darbojas lÄ«dzÄ«gi kÄ nepastÄvÄ«gi lieli masÄ«vi paralÄli Java. Es domÄju, iedomÄjieties, ka divi pavedieni raksta paralÄlÄ masÄ«vÄ, viens no tiem uzvar, bet otrs attiecÄ«gi zaudÄ, un jÅ«s nezinÄt, kurÅ” no tiem ir kurÅ”. Ja tie nav nepastÄvÄ«gi, tad pasÅ«tÄ«jums var bÅ«t tÄds, kÄdu vÄlaties - un tas darbojas patieÅ”Äm labi. CilvÄkiem patieÅ”Äm rÅ«p darbÄ«bu secÄ«ba, viÅi ievieto gaistoÅ”us pareizajÄs vietÄs un sagaida ar atmiÅu saistÄ«tas veiktspÄjas problÄmas pareizajÄs vietÄs. PretÄjÄ gadÄ«jumÄ viÅi vienkÄrÅ”i rakstÄ«tu kodu cilpu veidÄ 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 tas tur nedarbojas. Bet H2O tas nav ne Java, ne Scala; ja vÄlaties, varat to uzskatÄ«t par "Java mÄ«nus mÄ«nusu". Tas ir ļoti skaidrs programmÄÅ”anas stils un ir lÄ«dzÄ«gs vienkÄrÅ”a C vai Java koda rakstÄ«Å”anai ar cilpÄm un masÄ«viem. Bet tajÄ paÅ”Ä laikÄ atmiÅu var apstrÄdÄt terabaitos. Es joprojÄm izmantoju H2O. Ik pa laikam to izmantoju dažÄdos projektos ā un tÄ joprojÄm ir ÄtrÄkÄ lieta, desmitiem reižu ÄtrÄka par konkurentiem. Ja veicat lielos datus, izmantojot kolonnu datus, ir ļoti grÅ«ti pÄrspÄt H2O.
Tehniskie izaicinÄjumi
Andrejs: KÄds ir bijis tavs lielÄkais izaicinÄjums visÄ tavÄ karjerÄ?
Klints: Vai mÄs apspriežam jautÄjuma tehnisko vai netehnisko daļu? Es teiktu, ka lielÄkie izaicinÄjumi nav tehniski.
Kas attiecas uz tehniskajiem izaicinÄjumiem. Es viÅus vienkÄrÅ”i uzvarÄju. Es pat nezinu, kas bija lielÄkais, bet bija daži diezgan interesanti, kas prasÄ«ja diezgan daudz laika, garÄ«gas cÄ«Åas. Kad aizgÄju uz Sun, biju pÄrliecinÄts, ka uztaisÄ«Å”u Ätru sastÄdÄ«tÄju, un bariÅÅ” senioru atbildÄja, ka man tas nekad neizdosies. Bet es gÄju Å”o ceļu, pierakstÄ«ju kompilatoru lÄ«dz reÄ£istra sadalÄ«tÄjam, un tas bija diezgan Ätri. Tas bija tikpat Ätrs kÄ mÅ«sdienu C1, taÄu sadalÄ«tÄjs toreiz bija daudz lÄnÄks, un, skatoties vÄlÄk, tÄ bija liela datu struktÅ«ras problÄma. Man tas bija vajadzÄ«gs, lai uzrakstÄ«tu grafisko reÄ£istru sadalÄ«tÄju, un es nesapratu dilemmu starp koda izteiksmÄ«gumu un Ätrumu, kas pastÄvÄja tajÄ laikmetÄ un bija ļoti svarÄ«ga. IzrÄdÄ«jÄs, ka datu struktÅ«ra parasti pÄrsniedz tÄ laika x86s keÅ”atmiÅas lielumu, un tÄpÄc, ja sÄkotnÄji pieÅÄmu, ka reÄ£istra sadalÄ«tÄjs nostrÄdÄs 5-10 procentus no kopÄjÄ nervozÄÅ”anas laika, tad patiesÄ«bÄ tas izrÄdÄ«jÄs 50 procenti.
Laikam ejot, kompilators kļuva tÄ«rÄks un efektÄ«vÄks, vairÄkos gadÄ«jumos pÄrtrauca Ä£enerÄt Å”ausmÄ«gu kodu, un veiktspÄja arvien vairÄk sÄka lÄ«dzinÄties C kompilatora radÄ«tajam. Ja vien, protams, neuzrakstiet kÄdu stulbumu, ko pat C nepaÄtrina. . Ja rakstÄ«sit kodu, piemÄram, C, vairÄkos gadÄ«jumos iegÅ«sit tÄdu veiktspÄju kÄ C. Un jo tÄlÄk, jo biežÄk jÅ«s dabÅ«jÄt kodu, kas asimptotiski sakrita ar C lÄ«meni, reÄ£istra sadalÄ«tÄjs sÄka izskatÄ«ties kÄ kaut kas pabeigts... neatkarÄ«gi no tÄ, vai jÅ«su kods darbojas Ätri vai lÄni. Es turpinÄju strÄdÄt pie sadalÄ«tÄja, lai tas veiktu labÄkas atlases. ViÅÅ” kļuva arvien lÄnÄks, bet viÅÅ” sniedza arvien labÄku sniegumu gadÄ«jumos, kad neviens cits netika galÄ. Es varÄtu ienirt reÄ£istru sadalÄ«tÄjÄ, aprakt tur mÄnesi darba, un pÄkÅ”Åi viss kods sÄktu izpildÄ«t par 5% ÄtrÄk. Tas notika ik pa laikam un reÄ£istra sadalÄ«tÄjs kļuva par mÄkslas darbu - visiem tas patika vai ienÄ«da, un akadÄmijas cilvÄki uzdeva jautÄjumus par tÄmu "kÄpÄc viss tiek darÄ«ts tÄ", kÄpÄc ne lÄ«niju skenÄÅ”ana, un kÄda starpÄ«ba. Atbilde joprojÄm ir tÄ pati: sadalÄ«tÄjs, kas balstÄ«ts uz grafiku krÄsoÅ”anu un ļoti rÅ«pÄ«gu darbu ar bufera kodu, ir lÄ«dzvÄrtÄ«gs uzvaras ierocim, vislabÄkajai kombinÄcijai, kuru neviens nevar uzvarÄt. Un tÄ ir diezgan nenozÄ«mÄ«ga lieta. Viss pÄrÄjais, ko tur dara sastÄdÄ«tÄjs, ir diezgan labi izpÄtÄ«tas lietas, kaut arÄ« tÄs ir novestas lÄ«dz mÄkslas lÄ«menim. Es vienmÄr darÄ«ju lietas, kurÄm vajadzÄja pÄrvÄrst kompilatoru par mÄkslas darbu. Bet nekas no tÄ nebija nekas ÄrkÄrtÄjs ā izÅemot reÄ£istru sadalÄ«tÄju. Triks ir bÅ«t uzmanÄ«giem nocirst zem slodzes, un, ja tas notiek (ja interesÄ, varu paskaidrot sÄ«kÄk), tas nozÄ«mÄ, ka jÅ«s varat iesaistÄ«ties agresÄ«vÄk, neriskÄjot pÄrkrist uzstÄÅ”anÄs grafikÄ. Tajos laikos bija bariÅÅ” pilna mÄroga kompilatoru, kas bija apkarinÄti ar baubÄm un svilpieniem, kuriem bija reÄ£istru sadalÄ«tÄji, bet neviens cits to nevarÄja izdarÄ«t.
ProblÄma ir tÄda, ka, ja pievienojat metodes, kas ir pakļautas ieklÄÅ”anai, palielinÄÅ”anai un ieklÄÅ”anas zonas palielinÄÅ”anai, izmantoto vÄrtÄ«bu kopa uzreiz pÄrspÄj reÄ£istru skaitu, un jums tÄs ir jÄsamazina. Kritiskais lÄ«menis parasti iestÄjas, kad sadalÄ«tÄjs padodas, un viens labs kandidÄts noplÅ«dei ir cita vÄrts, jÅ«s pÄrdosit dažas vispÄr mežonÄ«gas lietas. IekļauÅ”anas vÄrtÄ«ba Å”eit ir tÄda, ka jÅ«s zaudÄjat daļu no pieskaitÄmajÄm izmaksÄm, pieskaitÄmÄs izmaksas par zvanÄ«Å”anu un saglabÄÅ”anu, jÅ«s varat redzÄt vÄrtÄ«bas iekÅ”pusÄ un varat tÄs vÄl vairÄk optimizÄt. IeklÄÅ”anas izmaksas ir tÄdas, ka veidojas liels skaits dzÄ«vu vÄrtÄ«bu, un, ja jÅ«su reÄ£istra sadalÄ«tÄjs izdeg vairÄk nekÄ nepiecieÅ”ams, jÅ«s uzreiz zaudÄjat. TÄpÄc lielÄkajai daļai sadalÄ«tÄju ir problÄma: kad inlining ŔķÄrso noteiktu lÄ«niju, viss pasaulÄ sÄk cirst un produktivitÄte var tikt noskalota tualetÄ. Tie, kas ievieÅ” kompilatoru, pievieno dažas heiristikas: piemÄram, lai pÄrtrauktu iekļauÅ”anu, sÄkot ar kÄdu pietiekami lielu izmÄru, jo pieŔķīrumi visu sabojÄs. TÄdÄ veidÄ tiek izveidots locÄ«jums veiktspÄjas grafikÄ - jÅ«s inline, inline, sniegums lÄnÄm aug - un tad bum! ā tas nokrÄ«t kÄ Ätrs domkrats, jo jÅ«s pÄrÄk daudz oderÄjÄt. Å Ädi viss darbojÄs pirms Java parÄdÄ«Å”anÄs. Javai ir nepiecieÅ”ams daudz vairÄk inlining, tÄpÄc man bija jÄpadara savs sadalÄ«tÄjs daudz agresÄ«vÄks, lai tas izlÄ«dzinÄtu, nevis avarÄ, un, ja jÅ«s ievietojat pÄrÄk daudz, tas sÄk izliet, bet tad joprojÄm pienÄk brÄ«dis "ne vairÄk spilling". Å is ir interesants novÄrojums, un tas man vienkÄrÅ”i radÄs no nekurienes, nav acÄ«mredzams, bet tas labi atmaksÄjÄs. Es izmantoju agresÄ«vu ieklÄÅ”anu, un tas mani aizveda uz vietÄm, kur Java un C veiktspÄja darbojas blakus. Tie ir ļoti tuvu ā es varu uzrakstÄ«t Java kodu, kas ir ievÄrojami ÄtrÄks nekÄ C kods un tamlÄ«dzÄ«gas lietas, bet vidÄji kopumÄ tÄs ir aptuveni salÄ«dzinÄmas. Es domÄju, ka daļa no Ŕī nopelna ir reÄ£istru sadalÄ«tÄjs, kas ļauj man iekļauties pÄc iespÄjas stulbÄk. Es vienkÄrÅ”i iekļauju visu, ko redzu. Å eit jautÄjums ir par to, vai sadalÄ«tÄjs darbojas labi, vai rezultÄts ir saprÄtÄ«gi strÄdÄjoÅ”s kods. Tas bija liels izaicinÄjums: to visu saprast un likt tam darboties.
Mazliet par reģistru pieŔķirŔanu un daudzkodolu
Vladimir: TÄdas problÄmas kÄ reÄ£istru pieŔķirÅ”ana Ŕķiet kaut kÄda mūžīga, nebeidzama tÄma. Interesanti, vai kÄdreiz ir bijusi ideja, kas Ŕķita daudzsoloÅ”a un pÄc tam izgÄzÄs praksÄ?
Klints: Noteikti! ReÄ£istra pieŔķirÅ”ana ir apgabals, kurÄ mÄÄ£inÄt atrast heiristikas metodes, lai atrisinÄtu NP pilnÄ«gu problÄmu. Un jÅ«s nekad nevarat sasniegt ideÄlu risinÄjumu, vai ne? Tas ir vienkÄrÅ”i neiespÄjami. Paskaties, Ahead of Time kompilÄcija ā arÄ« tÄ darbojas slikti. Saruna Å”eit ir par dažiem vidÄjiem gadÄ«jumiem. Par tipisku veiktspÄju, lai jÅ«s varÄtu iet un izmÄrÄ«t kaut ko, kas, jÅ«suprÄt, ir labs tipisks sniegums - galu galÄ jÅ«s strÄdÄjat, lai to uzlabotu! ReÄ£istru pieŔķirÅ”ana ir tÄma par veiktspÄju. Kad jums ir pirmais prototips, tas darbojas un nokrÄso nepiecieÅ”amo, sÄkas izpildes darbs. Ir jÄiemÄcÄs labi izmÄrÄ«t. KÄpÄc tas ir svarÄ«gi? Ja jums ir skaidri dati, varat aplÅ«kot dažÄdas jomas un redzÄt: jÄ, Å”eit tas palÄ«dzÄja, bet tur viss sabojÄjÄs! Rodas dažas labas idejas, jÅ«s pievienojat jaunu heiristiku un pÄkÅ”Åi viss sÄk darboties vidÄji nedaudz labÄk. Vai arÄ« nesÄkas. Man bija virkne gadÄ«jumu, kad mÄs cÄ«nÄ«jÄmies par piecu procentu veiktspÄju, kas atŔķīra mÅ«su attÄ«stÄ«bu no iepriekÅ”ÄjÄ sadalÄ«tÄja. Un katru reizi tas izskatÄs Å”Ädi: kaut kur tu uzvari, kaut kur zaudÄ. Ja jums ir labi veiktspÄjas analÄ«zes rÄ«ki, varat atrast zaudÄtÄs idejas un saprast, kÄpÄc tÄs neizdodas. VarbÅ«t ir vÄrts atstÄt visu, kÄ tas ir, vai varbÅ«t nopietnÄk pieiet pie precizÄÅ”anas, vai iziet un kaut ko citu salabot. TÄ ir vesela virkne lietu! Es izveidoju Å”o forÅ”o uzlauÅ”anu, bet man vajag arÄ« Å”o, un Å”o, un Å”o - un to kopÄjÄ kombinÄcija sniedz dažus uzlabojumus. Un vientuļnieki var neizdoties. TÄds ir veiktspÄjas darbs pie NP pilnÄ«gÄm problÄmÄm.
Vladimir: Rodas sajÅ«ta, ka tÄdas lietas kÄ krÄsoÅ”ana alokatoros ir problÄma, kas jau ir atrisinÄta. Nu, tas ir izlemts jÅ«su vietÄ, spriežot pÄc jÅ«su teiktÄ, vai tad tas ir tÄ vÄrts...
Klints: Tas nav atrisinÄts kÄ tÄds. Jums tas ir jÄpÄrvÄrÅ” par āatrisinÄtuā. Ir sarežģītas problÄmas, un tÄs ir jÄrisina. Kad tas ir izdarÄ«ts, ir pienÄcis laiks strÄdÄt pie produktivitÄtes. Jums ir attiecÄ«gi jÄpieiet Å”im darbam - veiciet etalonus, apkopojiet metriku, izskaidrojiet situÄcijas, kad, atgriežoties pie iepriekÅ”ÄjÄs versijas, jÅ«su vecais uzlauzums atkal sÄka darboties (vai otrÄdi, apstÄjÄs). Un nepadodies, kamÄr kaut ko nesasniegsi. KÄ jau teicu, ja ir forÅ”as idejas, kas neizdevÄs, bet ideju reÄ£istru sadales jomÄ tas ir aptuveni bezgalÄ«gi. Varat, piemÄram, lasÄ«t zinÄtniskas publikÄcijas. Lai gan tagad Ŕī joma ir sÄkusi kustÄties daudz lÄnÄk un kļuvusi skaidrÄka nekÄ jaunÄ«bÄ. TaÄu Å”ajÄ jomÄ strÄdÄ neskaitÄmi daudz cilvÄku un visas viÅu idejas ir izmÄÄ£inÄÅ”anas vÄrtas, tÄs visas gaida spÄrnos. Un jÅ«s nevarat pateikt, cik tie ir labi, ja vien jÅ«s tos neizmÄÄ£inÄsit. Cik labi tÄs integrÄjas ar visu pÄrÄjo jÅ«su sadalÄ«tÄjÄ, jo alokators dara daudzas lietas, un dažas idejas jÅ«su konkrÄtajÄ sadalÄ«tÄjÄ nedarbosies, bet citÄ sadalÄ«tÄjÄ tÄs viegli. Galvenais veids, kÄ laimÄt sadalÄ«tÄju, ir izvilkt lÄnÄs lietas Ärpus galvenÄ ceļa un piespiest to sadalÄ«t pa lÄno ceļu robežÄm. TÄtad, ja vÄlaties palaist GC, izvÄlieties lÄno ceļu, deoptimizÄjiet, izÅemiet izÅÄmumu, visu Å”o lietu - jÅ«s zinÄt, ka Ŕīs lietas ir salÄ«dzinoÅ”i reti. Un tie ir patieÅ”Äm reti, es pÄrbaudÄ«ju. JÅ«s veicat papildu darbu, un tas atceļ daudzus ierobežojumus Å”iem lÄnajiem ceļiem, taÄu tas nav Ä«sti svarÄ«gi, jo tie ir lÄni un reti brauc. PiemÄram, nulles rÄdÄ«tÄjs - tas nekad nenotiek, vai ne? Jums ir jÄbÅ«t vairÄkiem ceļiem dažÄdÄm lietÄm, taÄu tiem nevajadzÄtu traucÄt galveno.
Vladimir: Ko jÅ«s domÄjat par daudzkodolu, ja ir tÅ«kstoÅ”iem kodolu vienlaikus? Vai tÄ ir noderÄ«ga lieta?
Klints: GPU panÄkumi liecina, ka tas ir diezgan noderÄ«gs!
Vladimir: Tie ir diezgan specializÄti. KÄ ar vispÄrÄjas nozÄ«mes procesoriem?
Klints: TÄds bija Azula biznesa modelis. Atbilde radÄs laikmetÄ, kad cilvÄkiem ļoti patika paredzama veiktspÄja. Toreiz bija grÅ«ti rakstÄ«t paralÄlo kodu. H2O kodÄÅ”anas modelis ir ļoti mÄrogojams, taÄu tas nav vispÄrÄja mÄrÄ·a modelis. VarbÅ«t nedaudz vispÄrÄ«gÄks nekÄ tad, ja tiek izmantots GPU. Vai mÄs runÄjam par Å”Ädas lietas izstrÄdes sarežģītÄ«bu vai tÄs izmantoÅ”anas sarežģītÄ«bu? PiemÄram, Azuls man iemÄcÄ«ja interesantu stundu, kas bija diezgan acÄ«mredzama: mazas keÅ”atmiÅas ir normÄlas.
LielÄkais izaicinÄjums dzÄ«vÄ
Vladimir: KÄ ir ar netehniskiem izaicinÄjumiem?
Klints: LielÄkais izaicinÄjums bija nebÅ«t... laipnam un jaukam pret cilvÄkiem. Un rezultÄtÄ es pastÄvÄ«gi nokļuvu ÄrkÄrtÄ«gi konfliktsituÄcijÄs. TÄs, kurÄs es zinÄju, ka lietas notiek nepareizi, bet nezinÄju, kÄ risinÄt Ŕīs problÄmas, un nevarÄju ar tÄm tikt galÄ. TÄdÄ veidÄ radÄs daudzas ilgtermiÅa problÄmas, kas ilga gadu desmitiem. Fakts, ka Java ir C1 un C2 kompilatori, ir tieÅ”as sekas tam. Fakts, ka desmit gadus pÄc kÄrtas Java valodÄ nebija daudzlÄ«meÅu kompilÄcijas, arÄ« ir tieÅ”as sekas. Ir skaidrs, ka mums bija vajadzÄ«ga Å”Äda sistÄma, bet nav skaidrs, kÄpÄc tÄ nepastÄvÄja. Man bija problÄmas ar vienu inženieri... vai inženieru grupu. KÄdreiz, kad sÄku strÄdÄt Sun, es biju... Labi, ne tikai tad, man vispÄr vienmÄr par visu ir savs viedoklis. Un es domÄju, ka tÄ ir taisnÄ«ba, ka jÅ«s varat vienkÄrÅ”i pieÅemt Å”o savu patiesÄ«bu un izstÄstÄ«t to. Jo Ä«paÅ”i tÄpÄc, ka lielÄko daļu laika man bija Å”okÄjoÅ”i taisnÄ«ba. Un, ja jums nepatÄ«k Ŕī pieeja... it Ä«paÅ”i, ja jÅ«s acÄ«mredzami maldÄties un darÄt muļķības... KopumÄ reti kurÅ” varÄtu paciest Å”o komunikÄcijas veidu. Lai gan daži varÄtu, piemÄram, es. Es visu savu dzÄ«vi esmu veidojis uz meritokrÄtiskiem principiem. Ja tu man parÄdÄ«si kaut ko nepareizi, es uzreiz pagriezos un teikÅ”u: tu teici muļķības. TajÄ paÅ”Ä laikÄ es, protams, atvainojos un viss, es atzÄ«mÄÅ”u nopelnus, ja tÄdi bÅ«s, un rÄ«koÅ”os citas pareizas darbÄ«bas. No otras puses, man ir Å”okÄjoÅ”i taisnÄ«ba par Å”okÄjoÅ”i lielu procentuÄlo daļu no kopÄjÄ laika. Un tas ne pÄrÄk labi darbojas attiecÄ«bÄs ar cilvÄkiem. Es necenÅ”os bÅ«t jauks, bet uzdodu jautÄjumu atklÄti. "Tas nekad nedarbosies, jo viens, divi un trÄ«s." Un viÅi teica: "Ak!" Bija arÄ« citas sekas, kuras, iespÄjams, bija labÄk ignorÄt: piemÄram, tÄs, kas noveda pie ŔķirÅ”anÄs no sievas un desmit gadus ilgas depresijas pÄc tam.
IzaicinÄjums ir cÄ«Åa ar cilvÄkiem, ar viÅu uztveri par to, ko jÅ«s varat vai nevarat, kas ir svarÄ«gi un kas nav. Bija daudz problÄmu saistÄ«bÄ ar kodÄÅ”anas stilu. Es joprojÄm rakstu daudz koda, un tajos laikos man pat nÄcÄs piebremzÄt, jo es veicu pÄrÄk daudz paralÄlu uzdevumu un darÄ«ju tos slikti, nevis koncentrÄjos uz vienu. Atskatoties atpakaļ, es uzrakstÄ«ju pusi koda Java JIT komandai, komandai C2. NÄkamais ÄtrÄkais kodÄtÄjs rakstÄ«ja uz pusi lÄnÄk, nÄkamais uz pusi lÄnÄk, un tas bija eksponenciÄls kritums. SeptÄ«tais cilvÄks Å”ajÄ rindÄ bija ļoti, ļoti lÄns ā tÄ notiek vienmÄr! Es pieskÄros daudz koda. Es paskatÄ«jos, kurÅ” ko ir rakstÄ«jis, bez izÅÄmuma skatÄ«jos uz viÅu kodu, pÄrskatÄ«ju katru no tiem un joprojÄm turpinÄju rakstÄ«t vairÄk pats nekÄ jebkurÅ” no viÅiem. Å Ä« pieeja nedarbojas ļoti labi ar cilvÄkiem. Dažiem cilvÄkiem tas nepatÄ«k. Un, kad viÅi netiek galÄ, sÄkas visÄdas sÅ«dzÄ«bas. PiemÄram, man reiz teica pÄrtraukt kodÄÅ”anu, jo es rakstÄ«ju pÄrÄk daudz koda un tas apdraud komandu, un man tas viss izklausÄ«jÄs kÄ joks: vecÄ«t, ja pÄrÄjÄ komanda pazÅ«d un es turpinu rakstÄ«t kodu, tu ZaudÄÅ”u tikai pusi komandas. No otras puses, ja es turpinu rakstÄ«t kodu un jÅ«s zaudÄjat pusi komandas, tas izklausÄs pÄc ļoti sliktas pÄrvaldÄ«bas. Es nekad Ä«sti par to nedomÄju, nekad par to nerunÄju, bet tas joprojÄm bija kaut kur manÄ galvÄ. ManÄ prÄtÄ griezÄs doma: "Vai jÅ«s visi mani jokojat?" TÄtad lielÄkÄ problÄma bija es un manas attiecÄ«bas ar cilvÄkiem. Tagad es sevi saprotu daudz labÄk, ilgu laiku biju programmÄtÄju komandas vadÄ«tÄjs, un tagad tieÅ”i saku cilvÄkiem: ziniet, es esmu tÄds, kÄds esmu, un jums ar mani bÅ«s jÄtiek galÄ - vai ir labi, ja es stÄvÄÅ”u. Å”eit? Un, kad viÅi sÄka ar to nodarboties, viss izdevÄs. PatiesÄ«bÄ es neesmu ne slikts, ne labs, man nav nekÄdu sliktu nodomu vai savtÄ«gu centienu, tÄ ir tikai mana bÅ«tÄ«ba, un man ar to kaut kÄ jÄsadzÄ«vo.
Andrejs: Pavisam nesen visi sÄka runÄt par intravertu paÅ”apziÅu un mÄ«kstajÄm prasmÄm kopumÄ. Ko jÅ«s varat teikt par Å”o?
Klints: JÄ, tÄ bija atziÅa un mÄcÄ«ba, ko es guvu ŔķirÅ”anÄs laikÄ no savas sievas. Tas, ko es iemÄcÄ«jos no ŔķirÅ”anÄs, bija izpratne par sevi. TÄ es sÄku saprast citus cilvÄkus. Izprotiet, kÄ Å”Ä« mijiedarbÄ«ba darbojas. Tas noveda pie atklÄjumiem viens pÄc otra. Bija apziÅa, kas es esmu un ko pÄrstÄvu. Ko es daru: vai nu esmu aizÅemts ar uzdevumu, vai arÄ« izvairos no konfliktiem, vai kaut kas cits ā un Å”is paÅ”apziÅas lÄ«menis patieÅ”Äm palÄ«dz noturÄt sevi savÄ kontrolÄ. PÄc tam viss iet daudz vieglÄk. Viena lieta, ko es atklÄju ne tikai sevÄ«, bet arÄ« citos programmÄtÄjos, ir nespÄja verbalizÄt domas, kad esat emocionÄlÄ stresa stÄvoklÄ«. PiemÄram, jÅ«s sÄžat un kodÄjat plÅ«smas stÄvoklÄ«, un tad viÅi pieskrien pie jums un sÄk histÄriski kliegt, ka kaut kas ir salÅ«zis, un tagad pret jums tiks veikti ÄrkÄrtÄji pasÄkumi. Un jÅ«s nevarat pateikt ne vÄrda, jo esat emocionÄlÄ stresa stÄvoklÄ«. IegÅ«tÄs zinÄÅ”anas ļauj sagatavoties Å”im brÄ«dim, izdzÄ«vot to un pÄriet uz atkÄpÅ”anÄs plÄnu, pÄc kura var kaut ko darÄ«t. TÄtad, jÄ, kad jÅ«s sÄkat saprast, kÄ tas viss darbojas, tas ir milzÄ«gs notikums, kas maina dzÄ«vi.
Es pats nevarÄju atrast Ä«stos vÄrdus, bet atcerÄjos darbÄ«bu secÄ«bu. Lieta ir tÄda, ka Ŕī reakcija ir tikpat fiziska, kÄ verbÄla, un jums ir nepiecieÅ”ama telpa. TÄda telpa dzena izpratnÄ. Tas ir tieÅ”i tas, kas ir jÄpaskaidro, un tad uzreiz paiet malÄ ā tÄ«ri fiziski atkÄpieties. Kad es klusÄju mutiski, es varu emocionÄli apstrÄdÄt situÄciju. Kad adrenalÄ«ns sasniedz jÅ«su smadzenes, pÄrslÄdz jÅ«s cÄ«Åas vai lidojuma režīmÄ, jÅ«s vairs nevarat neko pateikt, nÄ - tagad jÅ«s esat idiots, pÄtagu inženieris, kas nespÄj pienÄcÄ«gi reaÄ£Ät vai pat apturÄt uzbrukumu, un uzbrucÄjs ir brÄ«vs. uzbrukt atkal un atkal. Vispirms atkal jÄkļūst par sevi, jÄatgÅ«st kontrole, jÄiziet no režīma ācÄ«nies vai bÄgtā.
Un Å”im nolÅ«kam mums ir nepiecieÅ”ama verbÄlÄ telpa. Tikai brÄ«va vieta. Ja vispÄr kaut ko saki, tad vari pateikt tieÅ”i tÄ un tad ej un tieÅ”Äm atrodi sev āvietuā: dodies pastaigÄ pa parku, ieslÄdzies duÅ”Ä - tam nav nozÄ«mes. Galvenais ir uz laiku atvienoties no Ŕīs situÄcijas. TiklÄ«dz jÅ«s izslÄdzaties vismaz uz dažÄm sekundÄm, kontrole atgriežas, jÅ«s sÄkat domÄt prÄtÄ«gi. "Labi, es neesmu nekÄds idiots, es nedaru stulbas, es esmu diezgan noderÄ«gs cilvÄks." Kad esat spÄjuÅ”i sevi pÄrliecinÄt, ir pienÄcis laiks pÄriet uz nÄkamo posmu: izprast notikuÅ”o. Jums uzbruka, uzbrukums nÄca no vietas, kur jÅ«s to negaidÄ«jÄt, tÄ bija negodÄ«ga, zemiska slazds. Tas ir slikti. NÄkamais solis ir saprast, kÄpÄc uzbrucÄjam tas bija vajadzÄ«gs. TieÅ”Äm, kÄpÄc? VarbÅ«t tÄpÄc, ka viÅÅ” pats ir saÅ”utis? KÄpÄc viÅÅ” ir dusmÄ«gs? PiemÄram, tÄpÄc, ka viÅÅ” pats ir ieskrÅ«vÄjis un nevar uzÅemties atbildÄ«bu? Tas ir veids, kÄ rÅ«pÄ«gi rÄ«koties ar visu situÄciju. Bet tas prasa manevra telpu, verbÄlo telpu. Pats pirmais solis ir pÄrtraukt verbÄlo kontaktu. Izvairieties no diskusijÄm ar vÄrdiem. Atceliet to, dodieties prom, cik Ätri vien iespÄjams. Ja tÄ ir telefonsaruna, vienkÄrÅ”i nolieciet klausuli ā tÄ ir prasme, ko es apguvu, sazinoties ar savu bijuÅ”o sievu. Ja saruna nevedÄs, vienkÄrÅ”i sakiet "ardievu" un nolieciet klausuli. No otras telefona puses: "bla bla blah", jÅ«s atbildat: "jÄ, Äau!" un noliec klausuli. JÅ«s vienkÄrÅ”i pabeidzat sarunu. PÄc piecÄm minÅ«tÄm, kad tevÄ« atgriežas spÄja domÄt saprÄtÄ«gi, tu esi nedaudz atdzisis, kļūst iespÄjams pÄrdomÄt visu, notikuÅ”o un tÄlÄko. Un sÄciet formulÄt pÄrdomÄtu atbildi, nevis vienkÄrÅ”i reaÄ£Äjot emociju dÄļ. Man paÅ”apziÅas izrÄviens bija tieÅ”i tas, ka emocionÄla stresa gadÄ«jumÄ nevaru runÄt. IzkÄpÅ”ana no Ŕī stÄvokļa, domÄÅ”ana un plÄnoÅ”ana, kÄ reaÄ£Ät un kompensÄt problÄmas - tie ir pareizie soļi gadÄ«jumÄ, ja nevarat runÄt. VienkÄrÅ”Äkais veids ir aizbÄgt no situÄcijas, kurÄ izpaužas emocionÄls stress, un vienkÄrÅ”i pÄrtraukt piedalÄ«ties Å”ajÄ stresÄ. PÄc tam jÅ«s kļūstat spÄjÄ«gs domÄt, kad jÅ«s varat domÄt, jÅ«s kļūstat spÄjÄ«gs runÄt utt.
Starp citu, tiesÄ pretÄjÄs puses advokÄts mÄÄ£ina jums to izdarÄ«t - tagad ir skaidrs, kÄpÄc. Jo viÅam ir spÄja tevi nomÄkt lÄ«dz tÄdam stÄvoklim, ka tu pat nevari izrunÄt, piemÄram, savu vÄrdu. Ä»oti reÄlÄ nozÄ«mÄ jÅ«s nevarÄsit runÄt. Ja tas notiek ar jums un ja zinÄt, ka nonÄksit vietÄ, kur plosÄs verbÄlÄs cÄ«Åas, tÄdÄ vietÄ kÄ tiesa, varat ierasties ar savu advokÄtu. AdvokÄts iestÄsies par jums un apturÄs verbÄlo uzbrukumu, un darÄ«s to pilnÄ«gi likumÄ«gÄ veidÄ, un zaudÄtÄ Zen telpa atgriezÄ«sies pie jums. PiemÄram, man pÄris reizes nÄcÄs zvanÄ«t Ä£imenei, tiesnesis par to bija diezgan draudzÄ«gs, bet pretinieku advokÄts uz mani kliedza un kliedza, es pat nevarÄju saÅemties ne vÄrda. Å Ädos gadÄ«jumos man vislabÄk der mediatora izmantoÅ”ana. Starpnieks aptur visu Å”o spiedienu, kas nepÄrtrauktÄ straumÄ plÅ«st uz jums, jÅ«s atrodat nepiecieÅ”amo Zen telpu, un lÄ«dz ar to atgriežas spÄja runÄt. Å Ä« ir vesela zinÄÅ”anu joma, kurÄ ir daudz ko pÄtÄ«t, daudz ko atklÄt sevÄ«, un tas viss pÄrvÄrÅ”as augsta lÄ«meÅa stratÄÄ£iskos lÄmumos, kas dažÄdiem cilvÄkiem ir atŔķirÄ«gi. Dažiem cilvÄkiem nav iepriekÅ” aprakstÄ«to problÄmu; parasti cilvÄkiem, kas ir profesionÄli pÄrdevÄji, to nav. Visiem Å”iem cilvÄkiem, kuri pelna ar vÄrdiem ā slaveni dziedÄtÄji, dzejnieki, reliÄ£iskie vadÄ«tÄji un politiÄ·i, viÅiem vienmÄr ir ko teikt. ViÅiem tÄdu problÄmu nav, bet man ir.
Andrejs: Tas bija... negaidÄ«ti. Lieliski, mÄs jau esam daudz runÄjuÅ”i, un ir pienÄcis laiks beigt Å”o interviju. MÄs noteikti tiksimies konferencÄ un varÄsim turpinÄt Å”o dialogu. Tiekamies Hydra!