{"id":35851,"date":"2019-10-31T22:07:03","date_gmt":"2019-10-31T19:07:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\/"},"modified":"2019-10-31T22:07:03","modified_gmt":"2019-10-31T19:07:03","slug":"bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","title":{"rendered":"Ve\u013ek\u00fd rozhovor s Cliffom Clickom \u2014 otcom JIT kompil\u00e1cie v Jave","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ve\u013ek\u00fd rozhovor s Cliffom Clickom \u2014 otcom JIT kompil\u00e1cie v Jave\" src=\"\/wp-content\/uploads\/2019\/07\/9ea9740ef74c0ae14d334482af115222.png\" style=\"display:block;margin: 0 auto;\" \/><strong>Cliff Click<\/strong> \u2014 CTO of Cratus (IoT sensors for process improvement), founder and co-founder of several startups (including Rocket Realtime School, Neurensic, and H2O.ai) with multiple successful exits. Cliff wrote his first compiler at the age of 15 (Pascal for TRS Z-80)! He is best known for his work on C2 in Java (the Sea of Nodes IR). This compiler showed the world that JIT can produce high-quality code, which became one of the factors in Java's emergence as one of the main contemporary programming platforms. Later, Cliff helped Azul Systems build an 864-core mainframe with software written entirely in Java that supported GC pauses on a 500-gigabyte heap within 10 milliseconds. Generally, Cliff has managed to work on all aspects of JVM.<br clear=\"all\"><br \/>\n\u00a0<br \/>\nThis Hub post is a large interview with Cliff. We'll discuss the following topics:<\/p>\n<p><\/p>\n<ul>\n<li>Transitioning to low-level optimizations<\/li>\n<li>How to perform a large refactoring<\/li>\n<li>Cost model<\/li>\n<li>Training in low-level optimizations<\/li>\n<li>Practical examples of performance improvements<\/li>\n<li>Why create your own programming language<\/li>\n<li>Career of a performance engineer<\/li>\n<li>Technical challenges<\/li>\n<li>A bit about register allocation and multithreading<\/li>\n<li>The biggest challenge of your life<\/li>\n<\/ul>\n<p><\/p>\n<p>The interview is conducted by:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Andrey Satarin<\/strong> from Amazon Web Services. In his career, he has managed to work on completely different projects: testing a distributed NewSQL database at Yandex, a cloud detection system at Kaspersky Lab, a multiplayer game at Mail.ru, and a currency pricing service at Deutsche Bank. He is interested in testing large-scale backend and distributed systems.<\/li>\n<li><strong>Vladimir Sitnikov<\/strong> from Netcracker. He has been working for ten years on the performance and scalability of NetCracker OS \u2014 software used by telecom operators for automating network management and equipment processes. He is passionate about Java performance and Oracle Database. He is the author of more than a dozen performance enhancements in the official PostgreSQL JDBC driver.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"perehod-k-nizkourovnevym-optimizaciyam\">Transitioning to low-level optimizations<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: You are a well-known figure in the world of JIT compilation, Java, and performance optimization in general, aren't you?\u00a0<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: That's right!<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Let's start with some general questions about performance work. What do you think about the choice between high-level and low-level optimizations like working at the CPU level?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: \u00c1no, tu je v\u0161etko jednoduch\u00e9. Najr\u00fdchlej\u0161\u00ed k\u00f3d je ten, ktor\u00fd sa nikdy nesp\u00fa\u0161\u0165a. Preto je d\u00f4le\u017eit\u00e9 za\u010da\u0165 na vy\u0161\u0161ej \u00farovni a pracova\u0165 na algoritmoch. Lep\u0161ia O-ozna\u010denie prekon\u00e1 hor\u0161ie O-ozna\u010denie, pokia\u013e do toho nevst\u00fapia nejak\u00e9 dostato\u010dne ve\u013ek\u00e9 kon\u0161tanty. N\u00edzko\u00farov\u0148ov\u00e9 z\u00e1le\u017eitosti prich\u00e1dzaj\u00fa na rad ako posledn\u00e9. Zvy\u010dajne, ak ste optimalizovali zvy\u0161ok stacku dostato\u010dne dobre a st\u00e1le zost\u00e1va nie\u010do zauj\u00edmav\u00e9, to je n\u00edzka \u00farove\u0148. Ale ako za\u010da\u0165 na vy\u0161\u0161ej \u00farovni? Ako zisti\u0165, \u017ee ste na vy\u0161\u0161ej \u00farovni urobili dostatok pr\u00e1ce? Nu\u017e... nijako. Neexistuj\u00fa \u017eiadne hotov\u00e9 recepty. Mus\u00edte sa podrobne zaobera\u0165 probl\u00e9mom, rozhodn\u00fa\u0165, \u010do pl\u00e1nujete urobi\u0165 (aby ste sa nestratili v zbyto\u010dn\u00fdch krokoch) a a\u017e potom m\u00f4\u017eete siahnu\u0165 po profileri, ktor\u00fd m\u00f4\u017ee poveda\u0165 nie\u010do u\u017eito\u010dn\u00e9. V ur\u010ditom momente si uvedom\u00edte, \u017ee ste sa zbavili zbyto\u010dnost\u00ed a nastal \u010das zamera\u0165 sa na detailn\u00e9 ladienie na n\u00edzkej \u00farovni. To je ur\u010dite \u0161peci\u00e1lny druh umenia. Mnoho \u013eud\u00ed rob\u00ed zbyto\u010dn\u00e9 veci, ale pohybuje sa tak r\u00fdchlo, \u017ee na v\u00fdkon nemaj\u00fa \u010das. Ale to trv\u00e1, k\u00fdm sa ot\u00e1zka nevytvor\u00ed ako urgentn\u00e1. Zvy\u010dajne 99% \u010dasu nikoho nezauj\u00edma, \u010d\u00edm sa zaober\u00e1m, a\u017e do okamihu, ke\u010f sa na kritickej ceste objav\u00ed nie\u010do d\u00f4le\u017eit\u00e9, na \u010dom niekomu z\u00e1le\u017e\u00ed. A v tej chv\u00edli v\u00e1s v\u0161etci za\u010dn\u00fa tla\u010di\u0165 s ot\u00e1zkou \u201epre\u010do to od za\u010diatku nefungovalo dokonale\u201c. Celkovo, v\u017edy je \u010do zlep\u0161i\u0165 na v\u00fdkone. Ale 99% \u010dasu nem\u00e1te body, na ktor\u00fdch by ste mohli pracova\u0165! Sna\u017e\u00edte sa len nie\u010do rozbehn\u00fa\u0165 a po\u010das toho si uvedomujete, \u010do je d\u00f4le\u017eit\u00e9. Nikdy nemo\u017eno vedie\u0165 dopredu, \u017ee tento k\u00fasok treba robi\u0165 dokonale, preto v podstate mus\u00edte by\u0165 dokonal\u00ed vo v\u0161etkom. A to je nemo\u017en\u00e9 a takto to nerob\u00edte. V\u017edy je mno\u017estvo vec\u00ed, ktor\u00e9 treba opravi\u0165 \u2013 a to je \u00faplne norm\u00e1lne.<\/p>\n<p><\/p>\n<h1 id=\"kak-delat-bolshoy-refaktoring\">How to perform a large refactoring<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Ako pracujete na v\u00fdkone? Je to predsa probl\u00e9m, ktor\u00fd zasahuje do v\u0161etk\u00e9ho. Napr\u00edklad, museli ste niekedy pracova\u0165 na probl\u00e9moch, ktor\u00e9 vznikli v d\u00f4sledku prekrytia ve\u013ek\u00e9ho mno\u017estva existuj\u00facej funkcionality?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Sna\u017e\u00edm sa tomu vyhn\u00fa\u0165. Ak viem, \u017ee v\u00fdkon bude probl\u00e9m, prem\u00fd\u0161\u013eam o tom e\u0161te predt\u00fdm, ako za\u010dnem k\u00f3dova\u0165, najm\u00e4 nad d\u00e1tov\u00fdmi \u0161trukt\u00farami. Ale \u010dasto v\u0161etko objav\u00edte a\u017e nesk\u00f4r. A potom mus\u00edte siahnu\u0165 na extr\u00e9mne opatrenia a robi\u0165 to, \u010do naz\u00fdvam \u201eprepisuj a vl\u00e1dni\u201c: mus\u00edte sa chopit dostato\u010dne ve\u013ek\u00e9ho kusu. Niektor\u00e9 \u010dasti k\u00f3du budete musie\u0165 prepisova\u0165 kv\u00f4li v\u00fdkonnostn\u00fdm probl\u00e9mom alebo nie\u010domu in\u00e9mu. Ak\u00fdko\u013evek d\u00f4vod na prepisovanie k\u00f3du sa vyskytne, takmer v\u017edy je lep\u0161ie prepisova\u0165 v\u00e4\u010d\u0161\u00ed kus, ne\u017e men\u0161\u00ed kus. V tomto okamihu v\u0161etci za\u010dn\u00fa trias\u0165 od strachu: \u201eoch nie, nem\u00f4\u017eeme sa dotkn\u00fa\u0165 to\u013eko k\u00f3du!\u201c. Ale v skuto\u010dnosti tak\u00fd pr\u00edstup takmer v\u017edy funguje ove\u013ea lep\u0161ie. Mus\u00edte sa hne\u010f vrhn\u00fa\u0165 na ve\u013ek\u00fd probl\u00e9m, obkresli\u0165 okolo neho ve\u013ek\u00fd kruh a poveda\u0165: v\u0161etko, \u010do je v kruhu, prepisujem. Hranica je predsa ove\u013ea men\u0161ia ako ten obsah, ktor\u00fd je vn\u00fatri, ktor\u00fd m\u00e1 by\u0165 nahraden\u00fd. A ak tak\u00e9to obkreslenie hran\u00edc umo\u017en\u00ed dokon\u010di\u0165 pr\u00e1cu vo vn\u00fatri dokonale \u2013 m\u00e1te vo\u013en\u00e9 ruky, robte si, \u010do chcete. Akon\u00e1hle rozumiete probl\u00e9mu, proces prepisovania ide ove\u013ea hlad\u0161ie, preto si ukousnite ve\u013ek\u00fd kus!<br \/>\nZ\u00e1rove\u0148, ke\u010f rob\u00edte prepis ve\u013ek\u00fdm kusom a uvedomujete si, \u017ee v\u00fdkon bude probl\u00e9m, m\u00f4\u017eete sa o\u0148 za\u010da\u0165 ob\u00e1va\u0165 hne\u010f. Zvy\u010dajne sa to prejav\u00ed v jednoduch\u00fdch veciach ako \u201enekop\u00edrujte d\u00e1ta, spravujte d\u00e1ta \u010do najjednoduch\u0161ie, robte ich men\u0161ie\u201c. Pri ve\u013ek\u00fdch prepisovaniach existuj\u00fa \u0161tandardn\u00e9 sp\u00f4soby zlep\u0161enia v\u00fdkonu. A takmer v\u017edy sa to to\u010d\u00ed okolo d\u00e1t.<\/p>\n<p><\/p>\n<h1 id=\"model-stoimosti\">Cost model<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: V jednom z podcastov ste hovorili o modeloch n\u00e1kladov v kontexte v\u00fdkonu. M\u00f4\u017eete vysvetli\u0165, \u010do ste t\u00fdm mali na mysli?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Samozrejme. Narodil som sa v \u00e9re, ke\u010f bola v\u00fdkon procesora mimoriadne d\u00f4le\u017eit\u00fd. A t\u00e1to \u00e9ra sa op\u00e4\u0165 vracia - osud nie je bez ir\u00f3nie. \u017dil som v \u010dasoch osembitov\u00fdch strojov, m\u00f4j prv\u00fd po\u010d\u00edta\u010d pracoval s 256 bajtmi. Presne s bajtmi. V\u0161etko bolo ve\u013emi mal\u00e9. Musel som po\u010d\u00edta\u0165 in\u0161trukcie a ke\u010f sme za\u010dali postupova\u0165 vy\u0161\u0161ie v z\u00e1sobn\u00edku programovac\u00edch jazykov, jazyky preberali na seba \u010doraz viac a viac. Bolo tu Assembler, potom Basic, potom C, a C preberal pr\u00e1cu s mno\u017estvom detailov, ako je rozde\u013eovanie registrov a v\u00fdber in\u0161trukci\u00ed. Ale tam to bolo celkom jasn\u00e9 a ak som urobil ukazovate\u013e na in\u0161tanciu premennej, dostal som load a t\u00e1to in\u0161trukcia mala zn\u00e1my n\u00e1klad. Hardv\u00e9r poskytuje zn\u00e1me mno\u017estvo strojov\u00fdch cyklov, tak\u017ee r\u00fdchlos\u0165 vykon\u00e1vania r\u00f4znych vec\u00ed sa d\u00e1 jednoducho vypo\u010d\u00edta\u0165 s\u010d\u00edtan\u00edm v\u0161etk\u00fdch in\u0161trukci\u00ed, ktor\u00e9 pl\u00e1nujete spusti\u0165. Ka\u017ed\u00e9 compare\/test\/branch\/call\/load\/store sa dalo s\u010d\u00edta\u0165 a poveda\u0165: tu m\u00e1\u0161 a to je doba vykon\u00e1vania. Pri zlep\u0161ovan\u00ed v\u00fdkonu si ur\u010dite v\u0161imne\u0161, ak\u00e9 \u010d\u00edsla sa vz\u0165ahuj\u00fa na mal\u00e9 hor\u00face cykly.\u00a0<br \/>\nAle len \u010do prejde\u0161 na Java, Python a podobn\u00e9 veci, ve\u013emi r\u00fdchlo sa vz\u010fa\u013euje\u0161 od n\u00edzko\u00farov\u0148ov\u00e9ho hardv\u00e9ru. Ak\u00fa cenu m\u00e1 volanie gettera v Java? Ak JIT v HotSpot v\u0161etko spr\u00e1vne <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.openjdk.java.net\/display\/HotSpot\/Inlining\">zainlinoval<\/a><\/noindex>, bude to load, ale ak to neurobil \u2013 to bude volanie funkcie. Preto\u017ee volanie le\u017e\u00ed na hor\u00facom cykle, zru\u0161\u00ed v\u0161etky ostatn\u00e9 optimaliz\u00e1cie v tomto cykle. Preto skuto\u010dn\u00e9 n\u00e1klady bud\u00fa ove\u013ea vy\u0161\u0161ie. A hne\u010f str\u00e1ca\u0161 schopnos\u0165 pozera\u0165 sa na kus k\u00f3du a rozumie\u0165 tomu, ak\u00e9 n\u00e1klady na vykonanie z poh\u013eadu frekvencie procesora, pou\u017e\u00edvan\u00ed pam\u00e4te a cache. V\u0161etko toto sa st\u00e1va zauj\u00edmav\u00e9 len vtedy, ak sa skuto\u010dne ponor\u00ed\u0161 do v\u00fdkonu.<br \/>\nPr\u00e1ve sme sa ocitli v situ\u00e1cii, ke\u010f r\u00fdchlosti procesorov u\u017e viac ne\u017e desa\u0165ro\u010die takmer nerast\u00fa. Star\u00e9 \u010dasy sa vracaj\u00fa! U\u017e nem\u00f4\u017eete po\u010d\u00edta\u0165 s dobrou jednoprocesorovou v\u00fdkonnos\u0165ou. Ale ak sa n\u00e1hodou pust\u00edte do paraleln\u00fdch v\u00fdpo\u010dtov \u2013 je to \u0161ialene zlo\u017eit\u00e9, v\u0161etci sa na v\u00e1s pozeraj\u00fa ako na Jamesa Bonda. Desiatky n\u00e1sobn\u00fdch ur\u00fdchlen\u00ed sa obvykle objavuj\u00fa tam, kde niekto nie\u010do prehliadol. Paralelnos\u0165 si vy\u017eaduje ve\u013ea pr\u00e1ce. Aby ste dosiahli ono desiatkov\u00e9 ur\u00fdchlenie, mus\u00edte pochopi\u0165 model n\u00e1kladov. \u010co a ko\u013eko stoj\u00ed. A na to treba pochopi\u0165, ako jazyk zapad\u00e1 do podlo\u017en\u00e9ho hardv\u00e9ru.<br \/>\nMartin Thompson na\u0161iel skvel\u00e9 slovo pre svoj blog <noindex><a rel=\"nofollow\" href=\"https:\/\/mechanical-sympathy.blogspot.com\/\">Mechanick\u00e1 s\u00facitnos\u0165<\/a><\/noindex>! Je potrebn\u00e9 pochopi\u0165, \u010do m\u00e1 hardv\u00e9r robi\u0165, ako to bude robi\u0165 a pre\u010do to v\u00f4bec rob\u00ed. Vyu\u017eit\u00edm tohto je dos\u0165 jednoduch\u00e9 za\u010da\u0165 po\u010d\u00edta\u0165 in\u0161trukcie a zisti\u0165, kde unik\u00e1 \u010das vykonania. Ak v\u0161ak nem\u00e1te pr\u00edslu\u0161n\u00e9 \u0161kolenie, jednoducho h\u013ead\u00e1te \u010diernu ma\u010dku v tmavej miestnosti. Neust\u00e1le vid\u00edm \u013eud\u00ed, ktor\u00ed optimalizuj\u00fa v\u00fdkonnos\u0165, a ktor\u00ed nemaj\u00fa najmen\u0161iu predstavu o tom, \u010do vlastne robia. T\u00edto sa ve\u013emi tr\u00e1pi a ve\u013emi sa nikam nepos\u00favaj\u00fa. A ke\u010f vezmem ten ist\u00fd k\u00f3d, prid\u00e1m p\u00e1r drobn\u00fdch trikov a dosiahnem p\u00e4\u0165n\u00e1sobn\u00e9 alebo desiatkov\u00e9 ur\u00fdchlenie, hovoria: takto je to nef\u00e9r, vedeli sme, \u017ee si lep\u0161\u00ed. \u00da\u017easn\u00e9. O \u010dom to hovor\u00edm\u2026 model n\u00e1kladov \u2013 to je o tom, ak\u00fd k\u00f3d p\u00ed\u0161e\u0161 a ako r\u00fdchlo v priemere funguje v celkovom obraze.<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: A ako si udr\u017eova\u0165 tak\u00fd objem v hlave? To sa dosahuje ve\u013ek\u00fdm mno\u017estvom sk\u00fasenost\u00ed, alebo? Kde sa tieto sk\u00fasenosti z\u00edskavaj\u00fa?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: No, svoju sk\u00fasenos\u0165 som z\u00edskal nie najjednoduch\u0161ou cestou. Programoval som v Assembleri e\u0161te v \u010dasoch, ke\u010f sa dalo zorientova\u0165 v ka\u017edej jednotliv\u00e9 in\u0161trukcii. Znie to hl\u00fapo, ale odvtedy m\u00e1m v hlave, v pam\u00e4ti, nav\u017edy zostaven\u00fd s\u00fabor in\u0161trukci\u00ed Z80. Nepam\u00e4t\u00e1m si men\u00e1 \u013eud\u00ed u\u017e min\u00fatu po rozhovore, ale pam\u00e4t\u00e1m si k\u00f3d nap\u00edsan\u00fd pred 40 rokmi. Z\u00e1bavn\u00e9, vyzer\u00e1 to ako syndr\u00f3m \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC_%D1%81%D0%B0%D0%B2%D0%B0%D0%BD%D1%82%D0%B0\">vedca idiota<\/a><\/noindex>\u00bb.<\/p>\n<p><\/p>\n<h1 id=\"obuchenie-nizkourovnevym-optimizaciyam\">Training in low-level optimizations<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Existuje nejak\u00fd jednoduch\u0161\u00ed sp\u00f4sob, ako sa do toho zapoji\u0165?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: \u00c1no aj nie. Hardv\u00e9r, ktor\u00fd v\u0161etci pou\u017e\u00edvame, sa za t\u00fa dobu ve\u013emi nezmenil. V\u0161etci pou\u017e\u00edvaj\u00fa x86, s v\u00fdnimkou smartf\u00f3nov na Arm. Ak sa nezaober\u00e1\u0161 nejak\u00fdm hardcore embeddingom, m\u00e1\u0161 v\u0161etko rovnak\u00e9. Dobre, pokra\u010dujme. In\u0161trukcie sa tie\u017e po st\u00e1ro\u010dia nemenili. Je potrebn\u00e9 \u00eds\u0165 a nap\u00edsa\u0165 nie\u010do v assembleri. Trochu, ale dos\u0165 na to, aby si za\u010dal rozumie\u0165. Usmievate sa, ale ja hovor\u00edm \u00faplne v\u00e1\u017ene. Mus\u00edte pochopi\u0165 zhodu medzi jazykom a hardv\u00e9rom. Potom by si mal \u00eds\u0165, nie\u010do nap\u00edsa\u0165 a urobi\u0165 mal\u00fd hra\u010dk\u00e1rsky kompil\u00e1tor pre mal\u00fd hra\u010dk\u00e1rsky jazyk. \u201eHra\u010dk\u00e1rsky\u201c znamen\u00e1, \u017ee by sa mal da\u0165 urobi\u0165 v rozumnom \u010dase. M\u00f4\u017ee by\u0165 super jednoduch\u00fd, ale mus\u00ed generova\u0165 in\u0161trukcie. Akt generovania in\u0161trukci\u00ed umo\u017en\u00ed pochopi\u0165 model n\u00e1kladov pre most medzi vysok\u00fdmi jazykmi, na ktor\u00fdch v\u0161etci p\u00ed\u0161u, a strojov\u00fdm k\u00f3dom, ktor\u00fd sa vykon\u00e1va na hardv\u00e9ri. T\u00e1to zhoda sa vryje do mozgu v momente p\u00edsania kompil\u00e1tora. Aj toho najjednoduch\u0161ieho kompil\u00e1tora. Potom sa m\u00f4\u017ee\u0161 za\u010da\u0165 pozera\u0165 na Java a na to, \u017ee m\u00e1 semantick\u00fa priepas\u0165 ove\u013ea hlb\u0161iu, a budova\u0165 na nej mosty omnoho zlo\u017eitej\u0161ie. V Jave je ove\u013ea \u0165a\u017e\u0161ie pochopi\u0165, \u010di bol n\u00e1\u0161 most dobr\u00fd alebo zl\u00fd, \u010do ho sp\u00f4sobuje, aby sa rozpadol a \u010do nie. Ale potrebuje\u0161 nejak\u00fd v\u00fdchodiskov\u00fd bod, ke\u010f sa pozer\u00e1\u0161 na k\u00f3d a rozumie\u0161: \u201eaha, tento getter by sa mal inlinova\u0165 zaka\u017ed\u00fdm\u201c. A potom zist\u00ed\u0161, \u017ee sa to ob\u010das deje, s v\u00fdnimkou situ\u00e1cie, ke\u010f sa met\u00f3da stane pr\u00edli\u0161 ve\u013ekou a JIT za\u010d\u00edna inlinova\u0165 v\u0161etko mo\u017en\u00e9. V\u00fdkon t\u00fdchto miest m\u00f4\u017ee\u0161 predpoveda\u0165 okam\u017eite. Zvy\u010dajne gettery funguj\u00fa dobre, ale potom sa pozrie\u0161 na ve\u013ek\u00e9 hor\u00face slu\u010dky a zist\u00ed\u0161, \u017ee tam pl\u00e1vaj\u00fa nejak\u00e9 volania funkci\u00ed, ktor\u00fdch \u00fa\u010del nie je jasn\u00fd. A v tom spo\u010d\u00edva probl\u00e9m s masov\u00fdm pou\u017e\u00edvan\u00edm getterov, d\u00f4vod, pre\u010do sa neinlinuj\u00fa \u2013 nie je jasn\u00e9, \u010di ide o getter. Ak m\u00e1\u0161 super mal\u00fa k\u00f3dov\u00fa z\u00e1klad\u0148u, d\u00e1 sa to jednoducho zapam\u00e4ta\u0165 a potom poveda\u0165: toto je getter, a toto je setter. V ve\u013ekej k\u00f3dovej z\u00e1kladni ka\u017ed\u00e1 funkcia \u017eije svoj vlastn\u00fd pr\u00edbeh, ktor\u00fd nikomu nie je zn\u00e1my. Profil\u00e9r hovor\u00ed, \u017ee sme stratili 24% \u010dasu na nejakej slu\u010dke a aby sme pochopili, \u010do t\u00e1to slu\u010dka rob\u00ed, mus\u00edme sa pozrie\u0165 na ka\u017ed\u00fa funkciu vo vn\u00fatri. Nie je mo\u017en\u00e9 to pochopi\u0165 bez \u0161t\u00fadia funkcie, a to v\u00e1\u017ene spoma\u013euje proces porozumenia. Preto nepou\u017e\u00edvam gettery a settery, pre\u0161iel som na nov\u00fa \u00farove\u0148!<br \/>\nKde z\u00edska\u0165 model n\u00e1kladov? No, je mo\u017en\u00e9 \u010d\u00edta\u0165 r\u00f4zne materi\u00e1ly, ale mysl\u00edm, \u017ee najlep\u0161\u00ed sp\u00f4sob je kona\u0165. Urobi\u0165 si mal\u00fd kompil\u00e1tor a to bude najlep\u0161\u00ed sp\u00f4sob, ako si osvoji\u0165 model n\u00e1kladov a usadi\u0165 ho vo svojej hlave. Mal\u00fd kompil\u00e1tor, ktor\u00fd by mohol fungova\u0165 na programovanie mikrovlnky \u2013 to je \u00faloha pre za\u010diato\u010dn\u00edka. Mysl\u00edm, \u017ee ak u\u017e m\u00e1\u0161 program\u00e1torsk\u00e9 zru\u010dnosti, malo by to posta\u010di\u0165. V\u0161etky tie veci, ako napr\u00edklad parsovanie re\u0165azca, ktor\u00fd bude nejak\u00fdm algebraick\u00fdm v\u00fdrazom, vytiahnu\u0165 odtia\u013e in\u0161trukcie matematick\u00fdch oper\u00e1ci\u00ed v spr\u00e1vnom porad\u00ed, zobra\u0165 spr\u00e1vne hodnoty z registrov \u2013 to v\u0161etko sa rob\u00ed na jedno zam\u00e1vanie. A pokia\u013e to rob\u00ed\u0161, to sa ti zap\u00ed\u0161e do hlavy. Mysl\u00edm, \u017ee v\u0161etci vedia, \u010d\u00edm sa zaober\u00e1 kompil\u00e1tor. A toto ti d\u00e1 pochopenie modelu n\u00e1kladov.<\/p>\n<p><\/p>\n<h1 id=\"prakticheskie-primery-uluchsheniya-proizvoditelnosti\">Practical examples of performance improvements<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Na \u010do \u010fal\u0161ie si treba d\u00e1va\u0165 pozor pri pr\u00e1ci na v\u00fdkonnosti?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: D\u00e1tov\u00e9 \u0161trukt\u00fary. Mimochodom, u\u017e d\u00e1vno som nemal tieto lekcie... <noindex>Rocket School<\/noindex>. Bolo to z\u00e1bavn\u00e9, ale vy\u017eadovalo to to\u013eko energie, a predsa m\u00e1m aj svoj \u017eivot! Dobre. Tak\u017ee, na jednej z ve\u013ek\u00fdch a zauj\u00edmav\u00fdch lekci\u00ed, \u201eKam odch\u00e1dza v\u00e1\u0161 v\u00fdkon\u201c, som \u0161tudentom dal pr\u00edklad: dva a pol gigabajtu fintech d\u00e1t sa \u010d\u00edtalo z CSV s\u00faboru a potom bolo potrebn\u00e9 spo\u010d\u00edta\u0165 po\u010det pred\u00e1van\u00fdch produktov. Be\u017en\u00e9 tikov\u00e9 trhov\u00e9 d\u00e1ta. UDP pakety premenen\u00e9 na textov\u00fd form\u00e1t, za\u010d\u00ednaj\u00face od 70. rokov. Chicago Mercantile Exchange \u2013 r\u00f4zne \u0161tandardy ako ropa, kukurica, s\u00f3jov\u00e9 b\u00f4by a podobne. Bolo potrebn\u00e9 spo\u010d\u00edta\u0165 tieto produkty, po\u010det obchodov, priemern\u00fd objem pohybu pe\u0148az\u00ed a tovaru, at\u010f. Je to celkom jednoduch\u00e1 obchodn\u00e1 matematika: n\u00e1js\u0165 k\u00f3d produktu (to s\u00fa 1-2 symboly v hash tabu\u013eke), z\u00edska\u0165 s\u00fa\u010det, prida\u0165 ho do jedn\u00e9ho z obchodn\u00fdch setov, prida\u0165 objem, prida\u0165 hodnotu a p\u00e1r \u010fal\u0161\u00edch vec\u00ed. Ve\u013emi jednoduch\u00e1 matematika. Hra\u010dk\u00e1rska implement\u00e1cia bola ve\u013emi priamo\u010diara: v\u0161etko le\u017ealo v s\u00fabore, \u010d\u00edtal som s\u00fabor a pos\u00faval sa po \u0148om, deliac jednotliv\u00e9 z\u00e1znamy na Java riadky, h\u013eadal som v nich potrebn\u00e9 veci a s\u010d\u00edtaval pod\u013ea vy\u0161\u0161ie op\u00edsanej matematiky. A to funguje s nejakou malou r\u00fdchlos\u0165ou. <\/p>\n<p><\/p>\n<p>S t\u00fdmto pr\u00edstupom je v\u0161etko jasn\u00e9, \u010do sa deje, a paraleln\u00e9 v\u00fdpo\u010dty tu nepom\u00f4\u017eu, \u017ee? Ukazuje sa, \u017ee p\u00e4\u0165n\u00e1sobn\u00e9 zv\u00fd\u0161enie v\u00fdkonu sa d\u00e1 dosiahnu\u0165 len v\u00fdberom spr\u00e1vnych d\u00e1tov\u00fdch \u0161trukt\u00far. A to prekvapuje aj sk\u00fasen\u00fdch program\u00e1torov! V mojom konkr\u00e9tnom pr\u00edpade bolo d\u00f4le\u017eit\u00e9, \u017ee netreba vykon\u00e1va\u0165 alok\u00e1ciu pam\u00e4te v hor\u00facej slu\u010dke. No, to nie je cel\u00e1 pravda, ale v z\u00e1sade \u2013 netreba alokova\u0165 \u201eraz za X\u201c, ke\u010f je X dostato\u010dne ve\u013ek\u00e9. Ke\u010f X predstavuje dve a pol gigabajtu, netreba alokova\u0165 ni\u010d \u201eraz za p\u00edsmeno\u201c, alebo \u201eraz za riadok\u201c, alebo \u201eraz za pole\u201c, ni\u010d tak\u00e9ho. Presne na to ide \u010das. Ako to vlastne funguje? Predstavte si, \u017ee vykon\u00e1vam volanie <code>String.split()<\/code> alebo <code>BufferedReader.readLine()<\/code>. <code>Readline<\/code> rob\u00ed re\u0165azec zo s\u00faboru bajtov, ktor\u00e9 pri\u0161li cez sie\u0165, raz pre ka\u017ed\u00fd riadok, pre ka\u017ed\u00fd z hundreds of millions riadkov. Beriem tento riadok, analyzujem ho a vyhadzujem. Pre\u010do vyhadzujem \u2013 no, u\u017e som ho spracoval, hotovo. Tak\u017ee, pre ka\u017ed\u00fd bajt, ktor\u00fd sa pre\u010d\u00edtal z t\u00fdchto 2.7G, sa zap\u00ed\u0161e dva symboly do re\u0165azca, teda u\u017e 5.4G, a na ni\u010d in\u00e9 ich nepotrebujem, preto sa vyhadzuj\u00fa. Ak sa pozrieme na priepustnos\u0165 pam\u00e4te, na\u010d\u00edtavame 2.7G, ktor\u00e9 prech\u00e1dzaj\u00fa pam\u00e4\u0165ou a pam\u00e4\u0165ovou zbernicou do procesora, a potom sa dvakr\u00e1t viac posiela do re\u0165azca v pam\u00e4ti, a v\u0161etko sa to spracov\u00e1va pri vytv\u00e1ran\u00ed ka\u017ed\u00e9ho nov\u00e9ho re\u0165azca. Ale mus\u00edm ho pre\u010d\u00edta\u0165, \u017eelezo ho \u010d\u00edta, aj ke\u010f sa v\u0161etko nesk\u00f4r spracuje. A mus\u00edm ho zap\u00edsa\u0165, preto\u017ee som vytvoril re\u0165azec a cache sa preplnili \u2013 cache nem\u00f4\u017ee poja\u0165 2.7G. Celkovo, pre ka\u017ed\u00fd pre\u010d\u00edtan\u00fd bajt pre\u010d\u00edtam \u010fal\u0161ie dva dodato\u010dn\u00e9 bajty a zap\u00ed\u0161em dva dodato\u010dn\u00e9 bajty, a v kone\u010dnom d\u00f4sledku m\u00e1me pomer 4:1 \u2013 v takom pomere bezradne m\u00ed\u0148ame priepustnos\u0165 pam\u00e4te. A potom sa ukazuje, \u017ee ak urob\u00edm <code>String.split()<\/code> \u2013 rob\u00edm to \u010faleko nie naposledy, tam m\u00f4\u017ee by\u0165 e\u0161te 6-7 pol\u00ed. Preto klasick\u00fd k\u00f3d na \u010d\u00edtanie CSV s n\u00e1sledn\u00fdm parsovan\u00edm riadkov vedie k strat\u00e1m priepustnosti pam\u00e4te v oblasti 14:1 v porovnan\u00ed s t\u00fdm, \u010do by ste naozaj chceli ma\u0165. Ak sa zbav\u00edte t\u00fdchto alok\u00e1ci\u00ed, m\u00f4\u017eete dosiahnu\u0165 p\u00e4\u0165n\u00e1sobn\u00e9 zr\u00fdchlenie. <\/p>\n<p><\/p>\n<p>A to nie je nie\u010do, \u010do by bolo ve\u013emi \u0165a\u017ek\u00e9. Ak sa pozriete na k\u00f3d z spr\u00e1vneho uhla, v\u0161etko sa st\u00e1va celkom jednoduch\u00fdm hne\u010f, ako si uvedom\u00edte podstatu probl\u00e9mu. Naozaj by ste nemali prest\u00e1va\u0165 alokova\u0165 pam\u00e4\u0165: probl\u00e9m je len v tom, \u017ee nie\u010do alokujete a hne\u010f to zomrie, a pritom to sp\u00e1li d\u00f4le\u017eit\u00fd zdroj, ktor\u00fdm v tomto pr\u00edpade je \u0161\u00edrka p\u00e1sma pam\u00e4te. A v\u0161etko toto vedie k poklesu v\u00fdkonu. Na x86 zvy\u010dajne potrebujete akt\u00edvne spa\u013eova\u0165 cykly procesora, ale tu ste sp\u00e1lili cel\u00fa pam\u00e4\u0165 ove\u013ea sk\u00f4r. Rie\u0161en\u00edm je zni\u017eova\u0165 po\u010det alok\u00e1ci\u00ed.\u00a0<br \/>\nIn\u00e1 \u010das\u0165 probl\u00e9mu spo\u010d\u00edva v tom, \u017ee ak spust\u00edte profiler, ke\u010f sa vy\u010derp\u00e1 pam\u00e4\u0165, presne v momente, ke\u010f sa to stane, zvy\u010dajne o\u010dak\u00e1vate n\u00e1vrat cache, preto\u017ee je pln\u00e1 odpadu, ktor\u00fd ste pr\u00e1ve vygenerovali s t\u00fdmito riadkami. Preto ka\u017ed\u00e1 oper\u00e1cia na\u010d\u00edtania alebo ulo\u017eenia sa st\u00e1va pomalou, preto\u017ee ved\u00fa k chyb\u00e1m v cache \u2013 cel\u00e1 cache sa stala pomalou, \u010dakaj\u00fac, k\u00fdm z nej od\u00edde odpad. Preto profilova\u010d iba zobraz\u00ed tepl\u00fd n\u00e1hodn\u00fd \u0161um, rozmazan\u00fd pozd\u013a\u017e cel\u00e9ho cyklu \u2013 nebude \u017eiadna osobitn\u00e1 hor\u00faca in\u0161trukcia alebo miesto v k\u00f3de. Iba \u0161um. A ak sa pozriete na cykly GC, v\u0161etky bud\u00fa v Young Generation a super r\u00fdchle \u2013 mikrosekundy alebo milisekundy maxim\u00e1lne. Preto\u017ee cel\u00e1 t\u00e1to pam\u00e4\u0165 umiera okam\u017eite. Vytv\u00e1rate miliardy gigabajtov, a on ich strih\u00e1, a strih\u00e1, a znova strih\u00e1. V\u0161etko sa to deje ve\u013emi r\u00fdchlo. Tak\u017ee m\u00e1me lacn\u00e9 cykly GC, tepl\u00fd \u0161um pozd\u013a\u017e cel\u00e9ho cyklu, ale chceme dosiahnu\u0165 5-n\u00e1sobn\u00e9 zr\u00fdchlenie. V tento moment by sa v hlave malo nie\u010do uzavrie\u0165 a zaznie\u0165: \u201epre\u010do tak?!\u201c. Prekro\u010denie p\u00e1sma pam\u00e4te sa nezobrazuje v klasickom debuggeri, je potrebn\u00e9 spusti\u0165 debugger hardv\u00e9rov\u00fdch po\u010d\u00edta\u010dov\u00fdch v\u00fdkonov\u00fdch \u010d\u00edta\u010dov a vidie\u0165 to samostatne a priamo. A nepriamo to mo\u017eno podozrieva\u0165 z t\u00fdchto troch sympt\u00f3mov. Tret\u00ed sympt\u00f3m \u2013 to je, ke\u010f sa pozriete na to, \u010do alokujete, p\u00fdtate sa profilu a on odpoved\u00e1: \u201eUrobil si miliardu riadkov, ale GC to zvl\u00e1dol bezplatne\u201c. Akon\u00e1hle sa to stane, uvedom\u00edte si, \u017ee ste vygenerovali pr\u00edli\u0161 ve\u013ea objektov a sp\u00e1lili cel\u00fa \u0161\u00edrku p\u00e1sma pam\u00e4te. Sp\u00f4sob, ako sa s t\u00fdm vyrovna\u0165, existuje, ale nie je o\u010dividn\u00fd.\u00a0<\/p>\n<p><\/p>\n<p>Probl\u00e9m v d\u00e1tovej \u0161trukt\u00fare: surov\u00e1 \u0161trukt\u00fara za v\u0161etk\u00fdm, \u010do sa deje, je pr\u00edli\u0161 ve\u013ek\u00e1, m\u00e1 2.7G na disku, a preto je ve\u013emi ne\u017eelan\u00e9 robi\u0165 k\u00f3piu tejto veci \u2013 chceli by ste ju na\u010d\u00edta\u0165 priamo z sie\u0165ov\u00e9ho byte bufferu do registrov, aby ste nemuseli \u010d\u00edta\u0165 a zapisova\u0165 ju tam a sp\u00e4\u0165 p\u00e4\u0165kr\u00e1t. Bohu\u017eia\u013e, Java \u0161tandardne neposkytuje tak\u00fa kni\u017enicu v r\u00e1mci JDK. Ale toto je predsa trivi\u00e1lne, nie? V podstate ide o 5-10 riadkov k\u00f3du, ktor\u00e9 implementuj\u00fa vlastn\u00e9ho bufferovan\u00e9ho na\u010d\u00edtava\u010da riadkov, ktor\u00fd imituje spr\u00e1vanie triedy re\u0165azcov a z\u00e1rove\u0148 je obalom okolo podkladov\u00e9ho byte bufferu. V\u00fdsledkom je, \u017ee pracujete takmer ako so re\u0165azcami, ale v skuto\u010dnosti sa pohybuj\u00fa ukazovatele na buffer a surov\u00e9 bajty sa nikam nekop\u00edruj\u00fa, a tak sa znovu vyu\u017e\u00edvaj\u00fa tie ist\u00e9 buffery, znova a znova, a opera\u010dn\u00fd syst\u00e9m je \u0161\u0165astn\u00fd prevzia\u0165 veci, na ktor\u00e9 je ur\u010den\u00fd, ako napr\u00edklad skryt\u00fa dvojit\u00fa buffer\u00e1ciu t\u00fdchto byte bufferov, a vy u\u017e viac nerecyklujete nekone\u010dn\u00fd pr\u00fad nepotrebn\u00fdch d\u00e1t. Mimochodom, vy si predsa uvedomujete, \u017ee pri pr\u00e1ci s GC je zaru\u010den\u00e9, \u017ee ka\u017ed\u00e9 pridelenie pam\u00e4te nebude vidite\u013en\u00e9 pre procesor po poslednom cykle GC? Preto toto nem\u00f4\u017ee by\u0165 v cache, a potom sa deje 100%-ne zaru\u010den\u00fd z\u00e1sah. Pri pr\u00e1ci s ukazovate\u013eom, na x86 z\u00edska\u0165 register z pam\u00e4te trv\u00e1 1-2 cykly, a akon\u00e1hle sa to stane, plat\u00edte, plat\u00edte, plat\u00edte, preto\u017ee cel\u00e1 pam\u00e4\u0165 je na <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_inclusion_policy\">NINE cache<\/a><\/noindex> \u2013 a toto je n\u00e1klad na pridelenie pam\u00e4te. Skuto\u010dn\u00fd n\u00e1klad.<\/p>\n<p><\/p>\n<p>In\u00fdmi slovami, d\u00e1tov\u00e9 \u0161trukt\u00fary s\u00fa to, \u010do sa \u0165a\u017eko men\u00ed. A akon\u00e1hle si uvedom\u00edte, \u017ee ste si vybrali nespr\u00e1vnu d\u00e1tov\u00fa \u0161trukt\u00faru, ktor\u00e1 v bud\u00facnosti zabije v\u00fdkon, zvy\u010dajne si vy\u017eaduje zna\u010dn\u00e9 \u00fasilie to napravi\u0165, a ak to neurob\u00edte, bude to len hor\u0161ie. Predov\u0161etk\u00fdm je potrebn\u00e9 prem\u00fd\u0161\u013ea\u0165 o d\u00e1tov\u00fdch \u0161trukt\u00farach, to je d\u00f4le\u017eit\u00e9. Hlavn\u00e9 n\u00e1klady spo\u010d\u00edvaj\u00fa v zlo\u017eit\u00fdch d\u00e1tov\u00fdch \u0161trukt\u00farach, ktor\u00e9 sa za\u010dn\u00fa pou\u017e\u00edva\u0165 v \u0161t\u00fdle \u201eskop\u00edroval som d\u00e1tov\u00fa \u0161trukt\u00faru X do d\u00e1tovej \u0161trukt\u00fary Y, preto\u017ee sa mi Y viac p\u00e1\u010di\u201c. Ale oper\u00e1cia kop\u00edrovania (ktor\u00e1 sa jav\u00ed ako lacn\u00e1) v skuto\u010dnosti utr\u00e1ca p\u00e1smo pam\u00e4te a tam je zakopan\u00e9 v\u0161etko straten\u00e9 vykon\u00e1vanie. Ak m\u00e1m obrovsk\u00fd re\u0165azec s JSON a chcem ho premeni\u0165 na \u0161trukt\u00farovan\u00e9 DOM-strom z POJO alebo nie\u010doho tak\u00e9ho, oper\u00e1cia parsovania tohto re\u0165azca a zostavenia POJO, a potom nov\u00e1 interakcia s POJO sa nielen premen\u00ed na zbyto\u010dn\u00e9 n\u00e1klady \u2013 je to nie\u010do, \u010do nie je lacn\u00e9. Okrem pr\u00edpadov, ak budete \u010d\u00edta\u0165 z POJO ove\u013ea \u010dastej\u0161ie ako z re\u0165azca. Takto mo\u017eno vysk\u00fa\u0161a\u0165 rozl\u00fa\u0161ti\u0165 re\u0165azec a vybra\u0165 z neho len potrebn\u00e9, bez prevodu do POJO. Ak sa to v\u0161etko deje na ceste, kde je potrebn\u00fd maxim\u00e1lny v\u00fdkon, \u017eiadne POJO \u2013 mus\u00edte sa nejako priamo hraba\u0165 v re\u0165azci.<\/p>\n<p><\/p>\n<h1 id=\"zachem-sozdavat-svoy-yazyk-programmirovaniya\">Why create your own programming language<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Povedali ste, \u017ee na pochopenie modelu n\u00e1kladov, mus\u00edte nap\u00edsa\u0165 svoj vlastn\u00fd mal\u00fd jazyk\u2026<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Nie jazyk, ale kompil\u00e1tor. Jazyk a kompil\u00e1tor s\u00fa r\u00f4zne veci. Najd\u00f4le\u017eitej\u0161ie rozl\u00ed\u0161enie je vo va\u0161ich hlav\u00e1ch.\u00a0<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Mimochodom, ak sa nem\u00fdlim, experimentujete so zakladan\u00edm vlastn\u00fdch jazykov. Pre\u010do?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Preto\u017ee m\u00f4\u017eem! Som napoly na d\u00f4chodku, tak\u017ee je to moje hobby. Po cel\u00fd \u017eivot som realizoval cudzie jazyky. Taktie\u017e som ve\u013ea pracoval na programovacom \u0161t\u00fdle. A tie\u017e preto, \u017ee vid\u00edm probl\u00e9my v in\u00fdch jazykoch. Vid\u00edm, \u017ee existuj\u00fa lep\u0161ie sp\u00f4soby, ako robi\u0165 be\u017en\u00e9 veci. A t\u00fdmi by som sa r\u00e1d riadil. U\u017e ma nebav\u00ed vidie\u0165 probl\u00e9my v sebe, v Jave, v Pythone, v akomko\u013evek inom jazyku. Moment\u00e1lne p\u00ed\u0161em v React Native, JavaScripte a Elme ako hobby, ktor\u00e9 nie je o d\u00f4chodku, ale o akt\u00edvnej pr\u00e1ci. A tie\u017e p\u00ed\u0161em v Pythone a pravdepodobne budem pokra\u010dova\u0165 v pr\u00e1ci na strojovom u\u010den\u00ed pre Java backendy. Existuje mno\u017estvo popul\u00e1rnych jazykov a ka\u017ed\u00fd z nich m\u00e1 zauj\u00edmav\u00e9 vlastnosti. Ka\u017ed\u00fd je v nie\u010dom dobr\u00fd a d\u00e1 sa sk\u00fasi\u0165 spoji\u0165 v\u0161etky tieto funkcie do jedn\u00e9ho. Tak\u017ee sa zaober\u00e1m \u0161t\u00fadiom pre m\u0148a zauj\u00edmav\u00fdch vec\u00ed, spr\u00e1van\u00edm jazyka, sna\u017e\u00edm sa vymyslie\u0165 rozumn\u00fa semantiku. A zatia\u013e sa mi to dar\u00ed! V s\u00fa\u010dasnosti bojujem so semantikou pam\u00e4te, preto\u017ee chcem ma\u0165 pam\u00e4\u0165 ako v C a Jave a z\u00edska\u0165 siln\u00fd model pam\u00e4te a semantiku pam\u00e4te pre na\u010d\u00edtavanie a ukladanie. Pritom ma\u0165 automatick\u00e9 odvodenie typov ako v Haskelli. T\u00fdmto sa zaober\u00e1m posledn\u00e9 2-3 mesiace, napr\u00edklad.<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Ak vytv\u00e1rate jazyk, ktor\u00fd berie lep\u0161ie aspekty z in\u00fdch jazykov, prem\u00fd\u0161\u013eali ste o tom, \u017ee niekto urob\u00ed opak: vezme va\u0161e n\u00e1pady a pou\u017eije ich vo svojom?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Presne tak vznikaj\u00fa nov\u00e9 jazyky! Pre\u010do je Java podobn\u00e1 C? Preto\u017ee C malo dobr\u00fa syntaxi, ktor\u00fa v\u0161etci ch\u00e1pali, a Java sa in\u0161pirovala touto syntaxi, pridala typov\u00fa bezpe\u010dnos\u0165, kontroly hran\u00edc pol\u00ed, GC a zlep\u0161ila niektor\u00e9 veci z C. Pridali svoje. Ale silno sa in\u0161pirovali, \u017ee? V\u0161etci stoj\u00ed na pleciach gigantov, ktor\u00ed boli pred vami \u2013 takto sa rob\u00ed pokrok.<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Ako ch\u00e1pem, v\u00e1\u0161 jazyk bude bezpe\u010dn\u00fd pokia\u013e ide o pou\u017e\u00edvanie pam\u00e4te. Prem\u00fd\u0161\u013eali ste o implement\u00e1cii nie\u010doho ako borrow checker z Rust? Pozerali ste sa na to, ak\u00fd je v\u00e1\u0161 n\u00e1zor?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: U\u017e dlh\u00fd \u010das programujem v C, so v\u0161etk\u00fdmi t\u00fdmito malloc a free pr\u00edkazmi, a ru\u010dne spravujem d\u013a\u017eku \u017eivotnosti. Viete, 90-95% ru\u010dne spravovanej \u017eivotnosti m\u00e1 rovnak\u00fa \u0161trukt\u00faru. A je ve\u013emi, ve\u013emi bolestiv\u00e9 sa t\u00fdm zaobera\u0165 ru\u010dne. Chcel by som, aby kompil\u00e1tor jednoducho povedal, \u010do sa deje a \u010do ste dosiahli svojimi akciami. Pre niektor\u00e9 veci to borrow checker rob\u00ed automaticky. Mal by tie\u017e automaticky vyvodzova\u0165 inform\u00e1cie, v\u0161etko rozumie\u0165 a ani ma neza\u0165a\u017eova\u0165 potrebou toto pochopenie vysvetli\u0165. Mal by vykon\u00e1va\u0165 minim\u00e1lne lok\u00e1lnu anal\u00fdzu \u00fanikou, a ak sa mu to nepodar\u00ed, a\u017e vtedy by sa mali prid\u00e1va\u0165 anot\u00e1cie typov, ktor\u00e9 by opisovali d\u013a\u017eku \u017eivotnosti \u2013 a tak\u00e1to sch\u00e9ma je ove\u013ea zlo\u017eitej\u0161ia ako borrow checker, alebo ak\u00fdko\u013evek existuj\u00faci kontrol\u00f3r pam\u00e4te. Vo\u013eba medzi \u201ev\u0161etko je v poriadku\u201c a \u201eni\u010d som nepochopil\u201c \u2014 nie, malo by existova\u0165 nie\u010do lep\u0161ie.\u00a0<br \/>\nTak\u017ee ako \u010dlovek, ktor\u00fd nap\u00edsal ve\u013ea k\u00f3du v C, pova\u017eujem podporu automatick\u00e9ho riadenia \u017eivotnosti za ve\u013emi d\u00f4le\u017eit\u00fa vec. Tie\u017e ma irituje, ako ve\u013emi Java vyu\u017e\u00edva pam\u00e4\u0165, a hlavn\u00e1 s\u0165a\u017enos\u0165 je na GC. Pri alok\u00e1cii pam\u00e4te v Jave ti nevr\u00e1ti pam\u00e4\u0165, ktor\u00e1 bola lok\u00e1lna po\u010das posledn\u00e9ho cyklu GC. V jazykoch s presnej\u0161\u00edm riaden\u00edm pam\u00e4te je to inak. Ak zavol\u00e1\u0161 malloc, okam\u017eite dostane\u0161 pam\u00e4\u0165, ktor\u00e1 sa zvy\u010dajne pr\u00e1ve pou\u017e\u00edvala. Zvy\u010dajne rob\u00ed\u0161 s pam\u00e4\u0165ou nejak\u00e9 do\u010dasn\u00e9 veci a okam\u017eite ju vracia\u0161. A t\u00e1 sa okam\u017eite vracia do poolu malloc-u, a \u010fal\u0161\u00ed cyklus malloc-u ju znovu \u0165ah\u00e1 von. Preto sa skuto\u010dn\u00e9 vyu\u017eitie pam\u00e4te zni\u017euje na mno\u017estvo \u017eiv\u00fdch objektov v danom okamihu, plus \u00faniky. A ak ti neunik\u00e1 v\u0161etko \u00faplne nepr\u00edjemn\u00fdm sp\u00f4sobom, v\u00e4\u010d\u0161ina pam\u00e4te je ulo\u017een\u00e1 v ke\u0161och a procesore, a to funguje r\u00fdchlo. Ale vy\u017eaduje mno\u017estvo ru\u010dn\u00e9ho riadenia pam\u00e4te s malloc a free, vyvolan\u00fdch na spr\u00e1vnom mieste a v spr\u00e1vnom porad\u00ed. Rust to dok\u00e1\u017ee spr\u00e1vne spravova\u0165 s\u00e1m a v mnoh\u00fdch pr\u00edpadoch pon\u00faka dokonca v\u00e4\u010d\u0161\u00ed v\u00fdkon, preto\u017ee spotreba pam\u00e4te sa z\u00fa\u017ei iba na aktu\u00e1lne v\u00fdpo\u010dty \u2013 na rozdiel od \u010dakania na \u010fal\u0161\u00ed cyklus GC, ktor\u00fd uvo\u013en\u00ed pam\u00e4\u0165. V\u00fdsledkom je, \u017ee sme dostali ve\u013emi zauj\u00edmav\u00fd sp\u00f4sob, ako zlep\u0161i\u0165 v\u00fdkon. A dos\u0165 siln\u00fd \u2013 mysl\u00edm, \u017ee som sa zaoberal tak\u00fdmito vecami pri spracovan\u00ed \u00fadajov pre fintech, a to umo\u017enilo dosahova\u0165 zr\u00fdchlenie a\u017e p\u00e4\u0165kr\u00e1t. To je dos\u0165 ve\u013ek\u00e9 zr\u00fdchlenie, najm\u00e4 vo svete, kde procesory u\u017e nie s\u00fa r\u00fdchlej\u0161ie, a my st\u00e1le \u010dak\u00e1me na zlep\u0161enia.<\/p>\n<p><\/p>\n<h1 id=\"karera-performans-inzhenera\">Career of a performance engineer<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: E\u0161te by som sa r\u00e1d op\u00fdtal na va\u0161u kari\u00e9ru ako celok. Stali ste sa zn\u00e1mym v\u010faka pr\u00e1ci na JIT v HotSpot, a potom ste pre\u0161li do Azul \u2013 \u010do je tie\u017e JVM spolo\u010dnos\u0165. Ale u\u017e ste sa zaoberali viac hardv\u00e9rom ne\u017e softv\u00e9rom. A potom ste zrazu pre\u0161li na Big Data a strojov\u00e9 u\u010denie, a potom na detekciu podvodov. Ako sa to stalo? To s\u00fa ve\u013emi odli\u0161n\u00e9 oblasti v\u00fdvoja.<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: U\u017e dlh\u0161\u00ed \u010das sa zaober\u00e1m programovan\u00edm a podarilo sa mi zap\u00edsa\u0165 sa do ve\u013emi r\u00f4znych aktiv\u00edt. A ke\u010f \u013eudia hovoria: \u201eoch, ty si ten, kto robil JIT pre Java!\u201c, je to v\u017edy z\u00e1bavn\u00e9. Predt\u00fdm som sa zaoberal klonom PostScript \u2013 toho jazyka, ktor\u00fd Apple kedysi pou\u017e\u00edvala pre svoje laserov\u00e9 tla\u010diarne. A pred t\u00fdm som robil implement\u00e1ciu jazyka Forth. Mysl\u00edm, \u017ee t\u00e9mu, ktor\u00e1 ma spojila, je v\u00fdvoj n\u00e1strojov. Cel\u00fd \u017eivot vytv\u00e1ram n\u00e1stroje, pomocou ktor\u00fdch in\u00ed \u013eudia p\u00ed\u0161u svoje \u00fa\u017easn\u00e9 programy. No venoval som sa aj v\u00fdvoju opera\u010dn\u00fdch syst\u00e9mov, ovl\u00e1da\u010dov, jadrov\u00fdch debuggers, jazykov pre v\u00fdvoj OS, ktor\u00e9 za\u010d\u00ednali trivi\u00e1lne, ale \u010dasom sa st\u00e1le zlo\u017eitej\u0161ie a zlo\u017eitej\u0161ie. No hlavn\u00fa t\u00e9mu, predsa len, tvor\u00ed v\u00fdvoj n\u00e1strojov. Ve\u013ek\u00e1 \u010das\u0165 m\u00f4jho \u017eivota pre\u0161la medzi Azul a Sun a bola o Jave. Ale ke\u010f som sa za\u010dal zaobera\u0165 Big Data a strojov\u00fdm u\u010den\u00edm, znova som si obliekol svoj sl\u00e1vnostn\u00fd klob\u00fak a povedal: \u201eOch, teraz m\u00e1me netrivi\u00e1lny probl\u00e9m a tu sa dej\u00fa naozaj zauj\u00edmav\u00e9 veci a s\u00fa tu \u013eudia, ktor\u00ed nie\u010do robia.\u201c Je to skvel\u00e1 cesta na rozvoj, ktorou stoj\u00ed za to prejs\u0165. <\/p>\n<p><\/p>\n<p>\u00c1no, ve\u013emi m\u00e1m r\u00e1d distribuovan\u00e9 v\u00fdpo\u010dty. Moja prv\u00e1 pr\u00e1ca bola v \u0161tudentsk\u00fdch rokoch v C, na reklamnom projekte. Boli to distribuovan\u00e9 v\u00fdpo\u010dty na \u010dipoch Zilog Z80, ktor\u00e9 zbierali d\u00e1ta pre anal\u00f3gov\u00e9 optick\u00e9 rozpozn\u00e1vanie textu, ktor\u00e9 vykon\u00e1val skuto\u010dn\u00fd anal\u00f3gov\u00fd analyz\u00e1tor. Bola to skvel\u00e1 a \u00faplne nezvy\u010dajn\u00e1 t\u00e9ma. Ale boli tam probl\u00e9my, nejak\u00e1 \u010das\u0165 nebola spr\u00e1vne rozpoznan\u00e1, a preto bolo potrebn\u00e9 vytiahnu\u0165 obr\u00e1zok a uk\u00e1za\u0165 ho \u010dloveku, ktor\u00fd u\u017e \u010d\u00edtal a ozn\u00e1mil, \u010do je na \u0148om nap\u00edsan\u00e9, a preto tam boli \u00falohy s d\u00e1tami, pri\u010dom tieto \u00falohy mali svoj jazyk. Bol tam backend, ktor\u00fd to v\u0161etko spracov\u00e1val \u2013 s\u00fabe\u017ene pracuj\u00face Z80 s behaj\u00facimi termin\u00e1lmi vt100 \u2013 jeden na \u010dloveka, a bola tam model paraleln\u00e9ho programovania na Z80. Ist\u00fd spolo\u010dn\u00fd kus pam\u00e4te, ktor\u00fd zdie\u013eali v\u0161etky Z80 v konfigur\u00e1cii typu \u201ehviezda\u201d; zdie\u013eal sa aj backplane, a polovica RAM sa zdie\u013eala v sieti, a \u010fal\u0161ia polovica bola s\u00fakromn\u00e1 alebo i\u0161la na nie\u010do in\u00e9. Zmysluplne zlo\u017eit\u00fd paraleln\u00fd distribuovan\u00fd syst\u00e9m so zdie\u013eanou\u2026 polozdie\u013eanou pam\u00e4\u0165ou. Kedy to bolo\u2026 U\u017e si ani nepam\u00e4t\u00e1m, niekde v polovici 80-tych rokov. Pekne d\u00e1vno.\u00a0<br \/>\n\u00c1no, pova\u017eujme, \u017ee 30 rokov je dos\u0165 d\u00e1vno. \u00dalohy spojen\u00e9 s distribuovan\u00fdmi v\u00fdpo\u010dtami existuj\u00fa u\u017e pomerne dlho, \u013eudia sa odjak\u017eiva sna\u017eili s nimi bojova\u0165. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Beowulf_(%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80)\">Beowulf<\/a><\/noindex>-klastry. Tieto klastry vyzeraj\u00fa ako\u2026 Napr\u00edklad: existuje Ethernet a v\u00e1\u0161 r\u00fdchly x86 je pripojen\u00fd k tomuto Ethernetu, a teraz by ste chceli z\u00edska\u0165 fake shared memory, preto\u017ee nikto sa vtedy nemohol venova\u0165 k\u00f3dovaniu distribuovan\u00fdch v\u00fdpo\u010dtov, bolo to pr\u00edli\u0161 zlo\u017eit\u00e9, a preto bola fake shared memory s ochranou str\u00e1n pam\u00e4te na x86, a ak ste p\u00edsali na t\u00fato str\u00e1nku, hovorili sme ostatn\u00fdm procesorom, \u017ee ak sa dostan\u00fa k tej istej shared memory, bude ju potrebn\u00e9 na\u010d\u00edta\u0165 od v\u00e1s. Tak sa objavil ak\u00fdsi protokol podpory koherencie cache a softv\u00e9r na to. Zauj\u00edmav\u00e1 koncepcia. Skuto\u010dn\u00fd probl\u00e9m bol samozrejme v nie\u010dom inom. V\u0161etko to fungovalo, ale r\u00fdchlo ste narazili na probl\u00e9my s v\u00fdkonnos\u0165ou, preto\u017ee nikto \u00faplne nech\u00e1pal model v\u00fdkonnosti na dostato\u010dne dobrej \u00farovni \u2013 ak\u00e9 s\u00fa vzory pr\u00edstupu k pam\u00e4ti, ako zabezpe\u010di\u0165, aby sa uzly navz\u00e1jom nepingovali donekone\u010dna, a tak \u010falej. <\/p>\n<p><\/p>\n<p>V H2O som pri\u0161iel na to, \u017ee samotn\u00ed v\u00fdvoj\u00e1ri s\u00fa zodpovedn\u00ed za ur\u010denie, kde sa skr\u00fdva paralelizmus a kde nie. Vyvinul som tak\u00fd k\u00f3dovac\u00ed model, \u017ee p\u00edsanie vysokov\u00fdkonn\u00e9ho k\u00f3du sa stalo jednoduch\u00fdm. Naopak, nap\u00edsa\u0165 k\u00f3d, ktor\u00fd be\u017e\u00ed pomaly, je n\u00e1ro\u010dn\u00e9 a bude vyzera\u0165 zle. Mus\u00edte sa naozaj sna\u017ei\u0165, aby ste nap\u00edsali pomal\u00fd k\u00f3d, mus\u00edte pou\u017e\u00edva\u0165 ne\u0161tandardn\u00e9 met\u00f3dy. Spomalen\u00fd k\u00f3d je vidite\u013en\u00fd na prv\u00fd poh\u013ead. Ako d\u00f4sledok spravidla p\u00ed\u0161eme k\u00f3d, ktor\u00fd funguje r\u00fdchlo, ale mus\u00edte sa zaobera\u0165 t\u00fdm, \u010do robi\u0165 v pr\u00edpade zdie\u013eanej pam\u00e4te. Cel\u00e9 to s\u00favis\u00ed s ve\u013ek\u00fdmi maticami a spr\u00e1vanie tam je podobn\u00e9 nevaultiln\u00fdm ve\u013ek\u00fdm maticiam v paralelnom Jave. Predstavte si, \u017ee dva vl\u00e1kna zapisuj\u00fa do paralelnej matice, jedno vyhr\u00e1 a druh\u00e9, pod\u013ea toho, prehr\u00e1, a vy neviete, kto je kto. Ak nie s\u00fa volat\u00edlne, poradie m\u00f4\u017ee by\u0165 ak\u00e9ko\u013evek \u2013 a skuto\u010dne to dobre funguje. \u013dudia sa naozaj staraj\u00fa o poradie oper\u00e1ci\u00ed, spr\u00e1vne rozmiest\u0148uj\u00fa volat\u00edlne a na spr\u00e1vnych miestach o\u010dak\u00e1vaj\u00fa probl\u00e9my s v\u00fdkonom s\u00favisiace s pam\u00e4\u0165ou. Inak by jednoducho p\u00edsali k\u00f3d vo forme cyklov od 1 do N, kde N s\u00fa nejak\u00e9 trili\u00f3ny, s n\u00e1dejou, \u017ee v\u0161etky komplikovan\u00e9 pr\u00edpady sa automaticky stan\u00fa paraleln\u00fdmi \u2013 a tam to nefunguje. Ale v H2O to nie je ani Java, ani Scala, m\u00f4\u017eete to pova\u017eova\u0165 za \u201eJava minus minus\u201c, ak chcete. Je to ve\u013emi intuit\u00edvny sp\u00f4sob programovania a je podobn\u00fd p\u00edsaniu jednoduch\u00e9ho k\u00f3du v C alebo Jave s cyklami a maticami. A pritom m\u00f4\u017eete spracov\u00e1va\u0165 pam\u00e4\u0165 v terabajtoch. St\u00e1le pou\u017e\u00edvam H2O. Ob\u010das ho pou\u017e\u00edvam v r\u00f4znych projektoch \u2013 a to je st\u00e1le najr\u00fdchlej\u0161ia vec, ktor\u00e1 n\u00e1sobne prekon\u00e1va konkurenciu. Ak rob\u00edte Big Data s kol\u00f3nov\u00fdmi \u00fadajmi, je ve\u013emi \u0165a\u017ek\u00e9 prekona\u0165 H2O.<\/p>\n<p><\/p>\n<h1 id=\"tehnicheskie-chellenzhi\">Technical challenges<\/h1>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Ak\u00fd bol v\u00e1\u0161 najv\u00e4\u010d\u0161\u00ed probl\u00e9m v celej kari\u00e9re?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Diskutujeme o technickej alebo netechnickej str\u00e1nke ot\u00e1zky? Povedal by som, \u017ee najv\u00e4\u010d\u0161ie v\u00fdzvy nie s\u00fa technick\u00e9.\u00a0<br \/>\nPokia\u013e ide o technick\u00e9 v\u00fdzvy, jednoducho som ich prekonal. Ani neviem, ktor\u00e1 bola najv\u00e4\u010d\u0161ia, ale bolo ich nieko\u013eko dos\u0165 zauj\u00edmav\u00fdch, na ktor\u00e9 som str\u00e1vil mno\u017estvo \u010dasu a ment\u00e1lnych bojov. Ke\u010f som nast\u00fapil do Sunu, bol som presved\u010den\u00fd, \u017ee vytvor\u00edm r\u00fdchly kompil\u00e1tor, ale mnoho seniorov mi na to povedalo, \u017ee sa mi to nikdy nepodar\u00ed. Ale ja som sa tohto c\u00edtila, nap\u00edsal som kompil\u00e1tor a\u017e po alok\u00e1tor registrov a bol dos\u0165 r\u00fdchly. Bol rovnako r\u00fdchly ako modern\u00fd C1, ale vtedy bol alok\u00e1tor ove\u013ea pomal\u0161\u00ed a pri sp\u00e4tnom poh\u013eade \u2013 bol to probl\u00e9m ve\u013ekej d\u00e1tovej \u0161trukt\u00fary. Potreboval som ju, aby som nap\u00edsal grafick\u00fd alok\u00e1tor registrov, a nerozumel som dileme medzi vyjadrovacou schopnos\u0165ou k\u00f3du a r\u00fdchlos\u0165ou, ktor\u00e1 vtedy existovala a bola ve\u013emi d\u00f4le\u017eit\u00e1. Uk\u00e1zalo sa, \u017ee d\u00e1tov\u00e1 \u0161trukt\u00fara zvy\u010dajne presahuje ve\u013ekos\u0165 cache na x86 procesoroch tej doby, a preto ak som p\u00f4vodne predpokladal, \u017ee alok\u00e1tor registrov bude pracova\u0165 5-10 percent celkov\u00e9ho \u010dasu JIT, v skuto\u010dnosti to vy\u0161lo na 50 percent. <\/p>\n<p><\/p>\n<p>\u010cas plynul, kompil\u00e1tor sa stal st\u00e1le jasnej\u0161\u00edm a v\u00fdkonn\u00fdm, prestal generova\u0165 hrozn\u00fd k\u00f3d vo viacer\u00fdch pr\u00edpadoch a v\u00fdkon sa \u010doraz \u010dastej\u0161ie podobal tomu, \u010do poskytuje C kompil\u00e1tor. Ak samozrejme nep\u00ed\u0161e\u0161 nejak\u00e9 zl\u00e1taniny, ktor\u00e9 ani C nepoprave. Ak p\u00ed\u0161e\u0161 k\u00f3d ako v C, dost\u00e1va\u0161 v\u00fdkon ako v C vo v\u00e4\u010d\u0161ine pr\u00edpadov. A \u010d\u00edm \u010falej, t\u00fdm \u010dastej\u0161ie sa vyskytol k\u00f3d, ktor\u00fd asymptoticky zodpovedal \u00farovni C, alok\u00e1tor registrov sa za\u010dal podoba\u0165 na nie\u010do dokon\u010den\u00e9\u2026 bez oh\u013eadu na to, \u010di tvoj k\u00f3d be\u017e\u00ed r\u00fdchlo alebo pomaly. Pokra\u010doval som v pr\u00e1ci na alok\u00e1tore, aby robil lep\u0161ie alok\u00e1cie. St\u00e1val sa \u010doraz pomal\u0161\u00edm, ale poskytoval st\u00e1le lep\u0161\u00ed v\u00fdkon v t\u00fdch pr\u00edpadoch, kde si nikto in\u00fd neporadil. Mohol som sa ponori\u0165 do alok\u00e1tora registrov, investova\u0165 tam mesiac pr\u00e1ce a n\u00e1hle sa v\u0161etok k\u00f3d za\u010dal vykon\u00e1va\u0165 o 5% r\u00fdchlej\u0161ie. To sa dialo znova a znova a alok\u00e1tor registrov sa stal ak\u00fdmsi umeleck\u00fdm dielom \u2013 v\u0161etci ho milovali alebo nen\u00e1videli a \u013eudia z akademickej sf\u00e9ry sa p\u00fdtali \u201epre\u010do sa v\u0161etko rob\u00ed pr\u00e1ve takto\u201c, pre\u010do nie <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation#Linear_Scan\">line\u00e1rne skenovanie<\/a><\/noindex>, a \u010do je na tom in\u00e9. Odpove\u010f je rovnak\u00e1: alok\u00e1tor zalo\u017een\u00fd na farebnom grafu plus ve\u013emi prec\u00edzna pr\u00e1ca s medzibufferov\u00fdm k\u00f3dom rovn\u00e1 sa n\u00e1stroj v\u00ed\u0165azstva, najlep\u0161ia kombin\u00e1cia, ktor\u00fa nikto nem\u00f4\u017ee prekona\u0165. A je to dos\u0165 nejednozna\u010dn\u00e1 vec. V\u0161etko ostatn\u00e9, \u010do rob\u00ed kompil\u00e1tor \u2013 s\u00fa to celkom zn\u00e1me veci, aj ke\u010f s\u00fa tie\u017e priviedli na \u00farove\u0148 umenia. V\u017edy som robil veci, ktor\u00e9 mali premeni\u0165 kompil\u00e1tor na dielo umenia. Ale ni\u010d z toho nebolo nie\u010d\u00edm mimoriadnym \u2013 s v\u00fdnimkou alok\u00e1tora registrov. Z\u00e1klad je v tom, \u017ee je potrebn\u00e9 opatrne <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation\">zresklada\u0165<\/a><\/noindex> pod za\u0165a\u017een\u00edm a, ak sa to stane (m\u00f4\u017eem to vysvetli\u0165 podrobnej\u0161ie, ak je to zauj\u00edmav\u00e9), to znamen\u00e1, \u017ee je mo\u017en\u00e9 inlineova\u0165 agres\u00edvnej\u0161ie, bez rizika prekonania ohybu grafu v\u00fdkonu. V t\u00fdch \u010dasoch existovalo mno\u017estvo plnohodnotn\u00fdch kompil\u00e1torov, ozdoben\u00fdch haraburd\u00edm a zvukov\u00fdmi efektmi, v ktor\u00fdch boli alok\u00e1tory registrov, ale nikto in\u00fd s t\u00fdm u\u017e viac neuspel. <\/p>\n<p><\/p>\n<p>Probl\u00e9m je v tom, \u017ee ak prid\u00e1\u0161 met\u00f3dy vhodn\u00e9 na inlining a zvy\u0161uje\u0161 oblas\u0165 inlining, s\u00fabor pou\u017e\u00edvan\u00fdch hodn\u00f4t okam\u017eite prekro\u010d\u00ed po\u010det registrov a mus\u00ed\u0161 ich vyl\u00fa\u010di\u0165. Kritick\u00e1 \u00farove\u0148 obvykle nast\u00e1va, ke\u010f alok\u00e1tor kapituloval, a jeden dobr\u00fd kandid\u00e1t na vyl\u00fa\u010denie znamen\u00e1, \u017ee vyl\u00fa\u010di\u0161 niektor\u00e9 naozaj extr\u00e9mne hodnoty. Hodnota inliningu spo\u010d\u00edva v tom, \u017ee prich\u00e1dza\u0161 o \u010das\u0165 re\u017eijn\u00fdch n\u00e1kladov, n\u00e1kladov na volanie a ukladanie, m\u00f4\u017ee\u0161 vidie\u0165 hodnoty vo vn\u00fatri a m\u00f4\u017ee\u0161 ich \u010falej optimalizova\u0165. N\u00e1klady na inlining s\u00fa v tom, \u017ee sa vytvor\u00ed ve\u013ek\u00e9 mno\u017estvo \u017eiv\u00fdch hodn\u00f4t, a ak tvoj alok\u00e1tor registrov vyl\u00fa\u010di viac, ne\u017e je potrebn\u00e9, okam\u017eite str\u00e1ca\u0161. Preto v\u00e4\u010d\u0161ina alok\u00e1torov m\u00e1 probl\u00e9m: ke\u010f inlining prekro\u010d\u00ed ur\u010dit\u00fa hranicu, za\u010dn\u00fa sa vylu\u010dova\u0165 v\u0161etky mo\u017en\u00e9 hodnoty a v\u00fdkon sa d\u00e1 vyhodi\u0165 do z\u00e1chodu. T\u00ed, ktor\u00ed implementuj\u00fa kompil\u00e1tor, prid\u00e1vaj\u00fa nejak\u00e9 heuristiky: napr\u00edklad, aby zastavili inlining, ke\u010f dosiahne nejak\u00fa dostato\u010dne ve\u013ek\u00fa ve\u013ekos\u0165, preto\u017ee alok\u00e1cie v\u0161etko pokazia. Tak vznik\u00e1 zlomy\u0161lenie v\u00fdkonu \u2013 inlin\u00ed\u0161, inlin\u00ed\u0161, v\u00fdkon pomaly rastie \u2013 a potom bum! \u2013 spadne r\u00fdchlym tempom, preto\u017ee si inlinoval pr\u00edli\u0161 ve\u013ea. Takto to fungovalo a\u017e do pr\u00edchodu Javy. Java vy\u017eaduje omnoho viac inliningu, a preto som musel urobi\u0165 svoj alok\u00e1tor ove\u013ea agres\u00edvnej\u0161\u00edm, aby sa vyrovn\u00e1val a nespadol, a ak si inlinoval pr\u00edli\u0161 ve\u013ea \u2013 za\u010dne vyl\u00fa\u010di\u0165, ale n\u00e1sledne aj tak nast\u00e1va okamih \u201eu\u017e \u017eiadne vyl\u00fa\u010denie\u201c. To je zauj\u00edmav\u00e9 pozorovanie a pri\u0161lo ku mne akosi z ni\u010doho, nie je to zrejm\u00e9, ale dobre sa to vyplatilo. Za\u010dal som sa zameriava\u0165 na agres\u00edvny inlining a to ma priviedlo na miesta, kde s\u00fa v\u00fdkony Javy a C ved\u013ea seba. Skuto\u010dne s\u00fa bl\u00edzko \u2013 m\u00f4\u017eem p\u00edsa\u0165 k\u00f3d v Jave, ktor\u00fd je v\u00fdrazne r\u00fdchlej\u0161\u00ed ako k\u00f3d v C a podobne, ale v priemere, v \u0161ir\u0161om poh\u013eade, s\u00fa si pribli\u017ene rovn\u00e9. Mysl\u00edm, \u017ee \u010das\u0165 tejto z\u00e1sluhy patr\u00ed alok\u00e1torovi registrov, ktor\u00fd mi umo\u017e\u0148uje inlinova\u0165 maxim\u00e1lne jednoducho. Jednoducho inlinujem v\u0161etko, \u010do vid\u00edm. Ot\u00e1zka tu je, \u010di alok\u00e1tor funguje dobre, a \u010di v\u00fdsledkom je rozumne funguj\u00faci k\u00f3d. To bol ve\u013ek\u00fd probl\u00e9m: pochopi\u0165 toto v\u0161etko a prin\u00fati\u0165 to fungova\u0165.<\/p>\n<p><\/p>\n<h1 id=\"nemnogo-pro-allokaciyu-registrov-i-mnogoyadernost\">A bit about register allocation and multithreading<\/h1>\n<p><\/p>\n<p><strong>Vladim\u00edr<\/strong>: Probl\u00e9my ako alok\u00e1cia registrov sa zdaj\u00fa by\u0165 akousi ve\u010dnou nekone\u010dnou t\u00e9mou. Zauj\u00edmav\u00e9 je, \u010di niektor\u00e1 idea vyzerala s\u013eubne, ale potom zlyhala v praxi?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Samozrejme! Alok\u00e1cia registrov je oblas\u0165, kde sa sna\u017e\u00ed\u0161 prisp\u00f4sobi\u0165 nejak\u00e9 heuristiky na rie\u0161enie NP-\u00faplnej \u00falohy. A nikdy nedosiahne\u0161 dokonal\u00e9 rie\u0161enie, \u017ee? Je to jednoducho nemo\u017en\u00e9. Pozrite, Ahead of Time kompil\u00e1cia \u2013 t\u00e1 tie\u017e nefunguje dobre. Hovor\u00edme tu o niektor\u00fdch priemern\u00fdch pr\u00edpadoch. O typickej v\u00fdkonnosti, tak\u017ee m\u00f4\u017ee\u0161 \u00eds\u0165 a zmera\u0165 nie\u010do, \u010do pova\u017euje\u0161 za dobr\u00fa typick\u00fa v\u00fdkonnos\u0165 \u2013 ve\u010f nakoniec pracuje\u0161 na jej zlep\u0161en\u00ed! Alok\u00e1cia registrov je t\u00e9ma, ktor\u00e1 sa \u00faplne venuje v\u00fdkonnosti. Akon\u00e1hle m\u00e1\u0161 prv\u00fd prototyp, ktor\u00fd funguje a rob\u00ed to, \u010do m\u00e1, prich\u00e1dza pr\u00e1ca na v\u00fdkonnosti. Mus\u00ed\u0161 sa nau\u010di\u0165 dobre mera\u0165. Pre\u010do je to d\u00f4le\u017eit\u00e9? Ak existuj\u00fa jasn\u00e9 d\u00e1ta, m\u00f4\u017ee\u0161 sa pozrie\u0165 na r\u00f4zne oblasti a vidie\u0165: aha, toto pomohlo tu, ale tu to \u00faplne zlyhalo! Objavuj\u00fa sa nejak\u00e9 dobr\u00e9 n\u00e1pady, prid\u00e1\u0161 nov\u00fa heuristiku a zrazu v\u0161etko za\u010d\u00edna fungova\u0165 priemerne o nie\u010do lep\u0161ie. Alebo neza\u010dne. Mal som ve\u013ea pr\u00edpadov, ke\u010f sme sa sna\u017eili o p\u00e4\u0165 percent v\u00fdkonnosti, ktor\u00e9 rozde\u013eovali na\u0161u \u00fapravu od predch\u00e1dzaj\u00faceho alok\u00e1tora. A zaka\u017ed\u00fdm to vyzer\u00e1 takto: niekde sme vyhrali, niekde prehrali. Ak m\u00e1\u0161 dobr\u00e9 n\u00e1stroje na anal\u00fdzu v\u00fdkonnosti, m\u00f4\u017ee\u0161 n\u00e1js\u0165 zl\u00e9 n\u00e1pady a pochopi\u0165, pre\u010do zlyh\u00e1vaj\u00fa. Mo\u017eno by st\u00e1lo za to necha\u0165 v\u0161etko tak, alebo sa v\u00e1\u017enej\u0161ie zaobera\u0165 jemn\u00fdm doladen\u00edm, alebo \u00eds\u0165 a opravi\u0165 nie\u010do in\u00e9. To je cel\u00e1 \u0161k\u00e1la vec\u00ed! Urobil som tento skvel\u00fd hack, ale potrebujem e\u0161te tento, a tento, a tento \u2013 a t\u00e1to celkov\u00e1 kombin\u00e1cia prin\u00e1\u0161a ur\u010dit\u00e9 zlep\u0161enia. A jednotliv\u00e9 n\u00e1pady m\u00f4\u017eu zlyh\u00e1va\u0165. Tak\u00e1 je prirodzenos\u0165 pr\u00e1ce na v\u00fdkonnosti NP-\u00fapln\u00fdch \u00faloh.<\/p>\n<p><\/p>\n<p><strong>Vladim\u00edr<\/strong>: Zd\u00e1 sa, \u017ee veci ako farbenie v alok\u00e1toroch s\u00fa u\u017e vyrie\u0161enou \u00falohou. Nu\u017e, pre v\u00e1s vyrie\u0161enou, pod\u013ea toho, \u010do rozpr\u00e1vate, tak m\u00e1 to v\u00f4bec zmysel\u2026<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Nie je to vyrie\u0161en\u00e9 ako tak\u00e9. Ty to mus\u00ed\u0161 premeni\u0165 na \u201evyrie\u0161en\u00e9\u201c. Existuj\u00fa \u0165a\u017ek\u00e9 \u00falohy a tie je potrebn\u00e9 rie\u0161i\u0165. Ke\u010f je to hotov\u00e9, prich\u00e1dza \u010das na pr\u00e1cu na v\u00fdkonnosti. K tejto pr\u00e1ci treba pristupova\u0165 zodpovedne \u2013 robi\u0165 benchmarky, zbiera\u0165 metriky, vysvet\u013eova\u0165 situ\u00e1cie, ke\u010f sa pri n\u00e1vrate k predch\u00e1dzaj\u00facej verzii tvoj star\u00fd hack op\u00e4\u0165 rozbehol (respekt\u00edve naopak, prestal fungova\u0165). A neustupova\u0165, pokia\u013e nie\u010do nedosiahne\u0161. Ako som u\u017e povedal, ak sa z\u00e1zra\u010dn\u00e9 n\u00e1pady, ktor\u00e9 nefungovali, ale v oblasti alok\u00e1cie registrov s\u00fa n\u00e1pady prakticky nekone\u010dn\u00e9. Je mo\u017en\u00e9 napr\u00edklad \u010d\u00edta\u0165 vedeck\u00e9 publik\u00e1cie. Hoci sa t\u00e1to oblas\u0165 teraz pohybuje pomal\u0161ie a je jasnej\u0161ia ne\u017e v \u010dasoch svojej mladosti. Napriek tomu, v tejto oblasti pracuje nekone\u010dn\u00e9 mno\u017estvo \u013eud\u00ed a v\u0161etky ich n\u00e1pady treba vysk\u00fa\u0161a\u0165, v\u0161etky \u010dakaj\u00fa na svoj okamih. A nem\u00f4\u017ee\u0161 poveda\u0165, ak\u00e9 s\u00fa dobr\u00e9, ak ich nesk\u00fasi\u0161. Ako dobre sa integruj\u00fa so v\u0161etk\u00fdm ostatn\u00fdm vo tvojej alok\u00e1tore, ve\u010f alok\u00e1tor rob\u00ed mno\u017estvo vec\u00ed, a niektor\u00e9 n\u00e1pady v tvojom konkr\u00e9tnom alok\u00e1tore nemusia fungova\u0165, ale v inom alok\u00e1tore \u2013 hravo. Z\u00e1kladn\u00fd sp\u00f4sob, ako zv\u00ed\u0165azi\u0165 pre alok\u00e1tor \u2013 vytiahnu\u0165 pomal\u00e9 veci za hranice hlavnej cesty a n\u00fati\u0165, aby sa rozdelili na hranic\u00e1ch pomal\u00fdch ciest. Preto, ak chce\u0161 spusti\u0165 GC, \u00eds\u0165 po pomalej ceste, deaktivova\u0165 optimaliz\u00e1ciu, vyhodi\u0165 v\u00fdnimku, v\u0161etko v tomto duchu \u2013 vie\u0161, \u017ee tieto veci s\u00fa relat\u00edvne zriedkav\u00e9. A naozaj s\u00fa zriedkav\u00e9, kontroloval som. Rob\u00ed\u0161 dodato\u010dn\u00fa pr\u00e1cu a v\u010faka tomu zmizne mno\u017estvo obmedzen\u00ed na t\u00fdchto pomal\u00fdch cest\u00e1ch, ale to nie je ve\u013emi d\u00f4le\u017eit\u00e9, preto\u017ee s\u00fa pomal\u00e9 a m\u00e1lokedy sa po nich chod\u00ed. Napr\u00edklad nulov\u00fd ukazovate\u013e \u2013 on sa nikdy nestane, \u017ee? Je potrebn\u00e9 ma\u0165 nieko\u013eko ciest pre r\u00f4zne veci, ale nemali by si navz\u00e1jom prek\u00e1\u017ea\u0165 na hlavnej ceste.\u00a0<\/p>\n<p><\/p>\n<p><strong>Vladim\u00edr<\/strong>: \u010co si mysl\u00edte o multi-jadrovosti, ke\u010f jadr\u00e1 s\u00fa okam\u017eite tis\u00edce? Je to u\u017eito\u010dn\u00e1 vec?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: \u00daspech GPU ukazuje, \u017ee je to dos\u0165 u\u017eito\u010dn\u00e9!<\/p>\n<p><\/p>\n<p><strong>Vladim\u00edr<\/strong>: S\u00fa dos\u0165 \u0161pecifick\u00e9. A \u010do procesory v\u0161eobecn\u00e9ho ur\u010denia?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Tak\u017ee, to bola obchodn\u00e1 model Azul. Odpove\u010f pri\u0161la e\u0161te v \u00e9re, ke\u010f \u013eudia ve\u013emi milovali predv\u00eddate\u013en\u00fd v\u00fdkon. Vtedy bolo n\u00e1ro\u010dn\u00e9 p\u00edsa\u0165 paraleln\u00fd k\u00f3d. Model k\u00f3dovania H2O sa dobre \u0161k\u00e1luje, ale nie je to model pre v\u0161eobecn\u00e9 pou\u017eitie. Sn\u00e1\u010f len o nie\u010do univerz\u00e1lnej\u0161\u00ed ako pri pou\u017e\u00edvan\u00ed GPU. Hovor\u00edme o zlo\u017eitosti v\u00fdvoja takej veci alebo o zlo\u017eitosti jej pou\u017e\u00edvania? Napr\u00edklad, zauj\u00edmav\u00fa lekciu mi dala Azul, dos\u0165 nejasn\u00fa: mal\u00e9 ke\u0161ovanie je v poriadku.\u00a0<\/p>\n<p><\/p>\n<h1 id=\"samyy-bolshoy-chellenzh-v-zhizni\">The biggest challenge of your life<\/h1>\n<p><\/p>\n<p><strong>Vladim\u00edr<\/strong>: \u010co tak netechnick\u00e9 v\u00fdzvy?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Najv\u00e4\u010d\u0161ou v\u00fdzvou bolo neprejavova\u0165... dobrotu a l\u00e1skavos\u0165 vo\u010di \u013eu\u010fom. A ako n\u00e1sledok som sa neust\u00e1le ocital v extr\u00e9mne konfliktne laden\u00fdch situ\u00e1ci\u00e1ch. V t\u00fdch, v ktor\u00fdch som vedel, \u017ee v\u0161etko ide z kopca, ale nevedel som, ako pokra\u010dova\u0165 v rie\u0161en\u00ed t\u00fdchto probl\u00e9mov a nezvl\u00e1dol som ich. Mno\u017estvo dlhodob\u00fdch probl\u00e9mov trvaj\u00facich desiatky rokov sa objavilo pr\u00e1ve t\u00fdmto sp\u00f4sobom. To, \u017ee v Jave existuj\u00fa kompil\u00e1tory C1 a C2, je priamym d\u00f4sledkom tohto. To, \u017ee v Jave po\u010das desiatich rokov neexistovala viac\u00farov\u0148ov\u00e1 kompil\u00e1cia, je tie\u017e priamym d\u00f4sledkom. Je jasn\u00e9, \u017ee tak\u00fdto syst\u00e9m sme potrebovali, ale nie je jasn\u00e9, pre\u010do tu nebol. Mal som probl\u00e9my s jedn\u00fdm in\u017einierom... alebo skupinou in\u017einierov. Kedysi d\u00e1vno, ke\u010f som za\u010dal pracova\u0165 v Sun, bol som... Dobre, nielen vtedy, v\u017edy som mal svoj n\u00e1zor na v\u0161etko. A pova\u017eoval som za pravdu, \u017ee m\u00f4\u017eete jednoducho vzia\u0165 t\u00fa svoju pravdu a poveda\u0165 ju priamo. Najm\u00e4 preto, \u017ee som bol \u0161okuj\u00faco spr\u00e1vny v\u00e4\u010d\u0161inu \u010dasu. A ak sa ti tak\u00fd pr\u00edstup nep\u00e1\u010di... najm\u00e4 ak si zjavne na omyle a rob\u00ed\u0161 nezmysly... V podstate, len m\u00e1lo \u013eud\u00ed dok\u00e1zalo zn\u00e1\u0161a\u0165 tak\u00fa formu komunik\u00e1cie. Hoci niektor\u00ed mohli, napr\u00edklad ja. Cel\u00fd svoj \u017eivot som postavil na meritokratick\u00fdch princ\u00edpoch. Ak mi uk\u00e1\u017eete nie\u010do nespr\u00e1vne, okam\u017eite sa oto\u010d\u00edm a poviem: povedal si nezmysel. Pri tom sa samozrejme ospravedln\u00edm a tak \u010falej, uzn\u00e1m z\u00e1sluhy, ak nejak\u00e9 s\u00fa, a vykon\u00e1m \u010fal\u0161ie spr\u00e1vne kroky. Na druhej strane, som \u0161okuj\u00faco spr\u00e1vny \u0161okuj\u00faco ve\u013ek\u00e9 percento celkov\u00e9ho \u010dasu. A to ve\u013emi dobre nefunguje vo vz\u0165ahoch s \u013eu\u010fmi. Ani sa nesna\u017e\u00edm by\u0165 mil\u00fd, ale stav\u00edm ot\u00e1zku na ostrie. \u201eToto nikdy nefunguje, preto\u017ee raz, dva a tri.\u201c A oni: \u201eAch!\u201c. Boli aj in\u00e9 n\u00e1sledky, ktor\u00e9 je asi lep\u0161ie vynecha\u0165: napr\u00edklad tie, ktor\u00e9 viedli k rozvodu so \u017eenou a desa\u0165ro\u010dnej depresii po tom.<\/p>\n<p><\/p>\n<p>Challenging oneself means confronting others and their perceptions of what you can or cannot do, what is important and what is not. There have been many challenges regarding coding style. I still write a lot of code, and back then I even had to slow down because I was doing too many tasks at once poorly, instead of focusing on just one. Looking back, I wrote half of the Java JIT team's code, the C2 team. The next fastest coder wrote at half my speed, the next even slower, and it was an exponential decline. The seventh person in line was very, very slow \u2014 that's how it always is! I touched a lot of code. I watched what everyone wrote, without exception, I scrutinized their code, reviewed each one, and still managed to write more than any of them. This approach doesn't work very well with people. Some don\u2019t like it. And when they can\u2019t handle it, all sorts of complaints start. For example, once I was told to stop writing code because I was writing too much, and it was jeopardizing the team. To me, it all sounded like a joke: dude, if the entire remaining team disappears, and I keep writing code, you'll only lose half the team. On the other hand, if I keep writing code and you lose half the team \u2014 that sounds like really poor management. I never thought much about it, I never talked about it, but it was still somewhere in my mind. The thought that spun in the back of my consciousness was: \"Is everyone just joking?\" So, the biggest problem was me and my relationship with people. Now I understand myself much better, I led programmers for a long time, and now I directly tell people: you know, I am who I am, and you\u2019ll have to deal with me \u2014 is it okay if I stay here? And when they started to handle it, everything worked out. I\u2019m neither bad nor good, I have no bad intentions or selfish aspirations, it\u2019s just my nature, and one has to live with that.<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Recently, everyone has started talking about self-awareness for introverts, and in general about soft skills. What can be said about this?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: \u00c1no, to bolo pochopenie a lekcia, ktor\u00fa som si vzal z rozvodu so svojou man\u017eelkou. \u010co som si z tohto rozvodu odniesol \u2013 je to poznanie seba sam\u00e9ho. Tak som za\u010dal ch\u00e1pa\u0165 in\u00fdch \u013eud\u00ed. Ch\u00e1pa\u0165, ako toto interakcia funguje. To malo za n\u00e1sledok odkrytia jedno za druh\u00fdm. Objavilo sa uvedomenie, kto som a \u010do predstavujem. \u010co rob\u00edm: bu\u010f sa zameriavam na \u00falohu, alebo sa vyh\u00fdbam konfliktu, alebo nie\u010do in\u00e9 \u2013 a podobn\u00e1 \u00farove\u0148 sebapoznania naozaj pom\u00e1ha udr\u017ea\u0165 sa pohromade. Po tom v\u0161etkom ide v\u0161etko ove\u013ea jednoduch\u0161ie. Jedna vec, ktor\u00fa som objavil nielen u seba, ale aj u ostatn\u00fdch program\u00e1torov \u2013 je neschopnos\u0165 verbalizova\u0165 my\u0161lienky, ke\u010f si v stave emocion\u00e1lneho stresu. Napr\u00edklad, sed\u00ed\u0161 a programuje\u0161, si v stave toku a zrazu k tebe pribehuje niekto a za\u010dne hystericky kri\u010da\u0165, \u017ee nie\u010do je rozbit\u00e9, a teraz sa vo\u010di tebe bud\u00fa uplat\u0148ova\u0165 extr\u00e9mne opatrenia. A nem\u00f4\u017ee\u0161 ani slovo poveda\u0165, preto\u017ee si v stave emocion\u00e1lneho stresu. Nadobudnut\u00e9 vedomosti ti umo\u017e\u0148uj\u00fa pripravi\u0165 sa na t\u00fato chv\u00ed\u013eu, pre\u017ei\u0165 ju a prejs\u0165 na pl\u00e1n \u00faniku, po ktorom u\u017e m\u00f4\u017ee\u0161 nie\u010do urobi\u0165. Tak\u017ee \u00e1no, ke\u010f za\u010dne\u0161 ch\u00e1pa\u0165, ako toto v\u0161etko funguje \u2013 je to obrovsk\u00e9 \u017eivot men\u00edce udalosti.\u00a0<br \/>\nS\u00e1m som nedok\u00e1zal n\u00e1js\u0165 spr\u00e1vne slov\u00e1, ale zapam\u00e4tal som si sekvenciu krokov. Podstata je tak\u00e1, \u017ee t\u00e1to reakcia je rovnakou mierou fyzick\u00e1, ako aj verb\u00e1lna, a potrebuje\u0161 priestor. Tak\u00fd priestor, v zenovskom zmysle. Pr\u00e1ve toto je potrebn\u00e9 vysvetli\u0165 a potom sa okam\u017eite odsun\u00fa\u0165 na stranu \u2013 \u010disto fyzicky sa odsun\u00fa\u0165. Ke\u010f ml\u010d\u00edm, dok\u00e1\u017eem spracova\u0165 situ\u00e1ciu z h\u013eadiska em\u00f3ci\u00ed. Ako sa adrenal\u00edn dost\u00e1va do mozgu, prep\u00edna \u0165a do re\u017eimu \u201ebije\u0161 alebo be\u017e\u00ed\u0161\u201c, u\u017e nem\u00f4\u017ee\u0161 ni\u010d hovori\u0165, nie \u2013 teraz si idiot, in\u017einier na bitie, neschopn\u00fd d\u00f4stojnej odpovede alebo aspo\u0148 zastavi\u0165 \u00fatok, a \u00fato\u010dn\u00edk m\u00f4\u017ee \u00fato\u010di\u0165 znovu a znovu. Najprv sa mus\u00ed\u0161 znova sta\u0165 sebou, z\u00edska\u0165 kontrolu, vyjs\u0165 z re\u017eimu \u201ebije\u0161 alebo be\u017e\u00ed\u0161\u201c. <\/p>\n<p><\/p>\n<p>A na to je potrebn\u00fd verb\u00e1lny priestor. Proste vo\u013en\u00fd priestor. Ak v\u00f4bec nie\u010do poveda\u0165, m\u00f4\u017eeme poveda\u0165 pr\u00e1ve toto a potom \u00eds\u0165 a naozaj n\u00e1js\u0165 si \"priestor\": \u00eds\u0165 sa prejs\u0165 po parku, zamkn\u00fa\u0165 sa v sprche \u2013 je to jedno. Hlavn\u00e9 je do\u010dasne sa odpoji\u0165 od tej situ\u00e1cie. Hne\u010f ako sa aspo\u0148 na nieko\u013eko sek\u00fand odpoj\u00ed\u0161, kontrola sa vr\u00e1ti, za\u010dne\u0161 myslie\u0165 triezvo. \"Dobr\u00e9, nie som predsa nejak\u00fd idiot, nerob\u00edm hl\u00fape veci, som celkom u\u017eito\u010dn\u00fd \u010dlovek\". Hne\u010f ako si sa dok\u00e1zal presved\u010di\u0165, \u017ee je to pravda, je \u010das prejs\u0165 na \u010fal\u0161\u00ed krok: pochopi\u0165, \u010do sa stalo. Boli ste napadnut\u00ed, \u00fatok pri\u0161iel z ne\u010dakan\u00e9ho smeru, bola to nespravodliv\u00e1 podl\u00e1 pasca. To je zl\u00e9. \u010eal\u0161\u00ed krok \u2013 pochopi\u0165, pre\u010do bolo \u00fatokuj\u00facemu to potrebn\u00e9. Naozaj, pre\u010do? Mo\u017eno preto, \u017ee je s\u00e1m v besnen\u00ed? Pre\u010do je v besnen\u00ed? Napr\u00edklad preto, \u017ee sa s\u00e1m prepadol a nem\u00f4\u017ee prija\u0165 zodpovednos\u0165? Tak\u00fdmto sp\u00f4sobom je potrebn\u00e9 opatrne spracova\u0165 cel\u00fa situ\u00e1ciu. Ale na to potrebujeme priestor na man\u00e9vrovanie, verb\u00e1lny priestor. Najprv je potrebn\u00e9 preru\u0161i\u0165 verb\u00e1lny kontakt. Od\u00eds\u0165 od diskusie slovami. Zru\u0161i\u0165 to, od\u00eds\u0165 \u010do najr\u00fdchlej\u0161ie. Ak ide o telefon\u00e1t \u2013 proste zlo\u017ete telef\u00f3n \u2013 to je zru\u010dnos\u0165, ktor\u00fa som z\u00edskal po\u010das komunik\u00e1cie s b\u00fdvalou man\u017eelkou. Ak diskusia nevedie nikam dobr\u00e9mu, proste povedz \"zbohom\" a zlo\u017e sl\u00fachadlo. Z druhej strany sl\u00fachadla: \"bla-bla-bla\", ty odpoved\u00e1\u0161: \"aha, zbohom!\" a zlo\u017e\u00ed\u0161. Proste preru\u0161\u00ed\u0161 rozhovor. O p\u00e4\u0165 min\u00fat nesk\u00f4r, ke\u010f sa ti vr\u00e1ti schopnos\u0165 myslie\u0165 jasne, tro\u0161ku si sa ochladil, st\u00e1va sa mo\u017en\u00e9 v\u0161etko premyslie\u0165, \u010do sa vlastne stalo a \u010do bude \u010falej. A za\u010da\u0165 formulova\u0165 premyslen\u00fa odpove\u010f, nie len reagova\u0165 na em\u00f3cie. Pre m\u0148a bolo prelomom v seba\u00fazmore to, \u017ee v pr\u00edpade emocion\u00e1lneho stresu nem\u00f4\u017eem rozpr\u00e1va\u0165. Vyst\u00fapi\u0165 z tohto stavu, premyslie\u0165 a napl\u00e1nova\u0165, ako odpoveda\u0165 a kompenzova\u0165 probl\u00e9my \u2013 to s\u00fa spr\u00e1vne kroky, ke\u010f nem\u00f4\u017ee\u0161 hovori\u0165. Najjednoduch\u0161\u00ed sp\u00f4sob \u2013 ujs\u0165 od situ\u00e1cie, v ktorej sa prejavuje emocion\u00e1lny stres a proste presta\u0165 sa na tomto strese podie\u013ea\u0165. Potom nadob\u00fada\u0161 schopnos\u0165 myslie\u0165, ke\u010f m\u00f4\u017ee\u0161 myslie\u0165, objav\u00ed sa mo\u017enos\u0165 hovori\u0165, a tak \u010falej.<\/p>\n<p><\/p>\n<p>Mimochodom, v s\u00fadnej sieni sa advok\u00e1t protistrany sna\u017e\u00ed urobi\u0165 to ist\u00e9 s tebou \u2013 teraz je jasn\u00e9 pre\u010do. Preto\u017ee m\u00e1 mo\u017enos\u0165 \u0165a potla\u010di\u0165 do tak\u00e9ho stavu, \u017ee nebude\u0161 schopn\u00fd ani vyslovi\u0165 svoje meno, napr\u00edklad. V najdoslovnej\u0161om zmysle, nebude\u0161 schopn\u00fd hovori\u0165. Ak sa to s tebou deje a ak vie\u0161, \u017ee sa ocitne\u0161 na mieste, kde prebiehaj\u00fa verb\u00e1lne bitky, na mieste ako s\u00fad, m\u00f4\u017ee\u0161 pr\u00eds\u0165 so svoj\u00edm pr\u00e1vnikom. Pr\u00e1vnik \u0165a zast\u00fapi a ukon\u010d\u00ed verb\u00e1lny \u00fatok, a urob\u00ed to pr\u00e1voplatn\u00fdm sp\u00f4sobom, a k tebe sa vr\u00e1ti strata zenov\u00e9ho priestoru. Napr\u00edklad, nieko\u013ekokr\u00e1t som musel zavola\u0165 rodine, sudca k tomu pristupoval celkom priate\u013esky, ale advok\u00e1t protistrany na m\u0148a kri\u010dal a kri\u010dal, dokonca som nemal \u0161ancu zasiahnu\u0165. V tak\u00fdchto pr\u00edpadoch pre m\u0148a najlep\u0161ie funguje pou\u017eitie prostredn\u00edka. Prostredn\u00edk ukon\u010duje v\u0161etok ten tlak, ktor\u00fd na teba prich\u00e1dza nepretr\u017eit\u00fdm tokom, z\u00edska\u0161 potrebn\u00fd zenov\u00fd priestor a spolu s n\u00edm sa vr\u00e1ti schopnos\u0165 hovori\u0165. Je to cel\u00e1 oblas\u0165 poznania, v ktorej je potrebn\u00e9 sa ve\u013ea u\u010di\u0165, ve\u013ea objavova\u0165 vo vn\u00fatri seba, a toto v\u0161etko sa men\u00ed na vysok\u00fa\u00farov\u0148ov\u00e9 strategick\u00e9 rozhodnutia, r\u00f4zne pre r\u00f4znych \u013eud\u00ed. Niektor\u00ed \u013eudia nemaj\u00fa vy\u0161\u0161ie uveden\u00e9 probl\u00e9my, zvy\u010dajne ich nemaj\u00fa t\u00ed, ktor\u00ed sa profesion\u00e1lne zaoberaj\u00fa predajom. T\u00edto \u013eudia, ktor\u00ed si zar\u00e1baj\u00fa na \u017eivobytie slovami \u2013 zn\u00e1mi spev\u00e1ci, b\u00e1snici, n\u00e1bo\u017eensk\u00ed vodcovia a politici, maj\u00fa v\u017edy \u010do poveda\u0165. Nemaj\u00fa tak\u00e9 probl\u00e9my, ale ja ich m\u00e1m.<\/p>\n<p><\/p>\n<p><strong>Andrey<\/strong>: Bolo to\u2026 ne\u010dakan\u00e9. Skvele, u\u017e sme toho dos\u0165 prebrali a je \u010das ukon\u010di\u0165 tento rozhovor. Ur\u010dite sa stretneme na konferencii a m\u00f4\u017eeme pokra\u010dova\u0165 v tomto dial\u00f3gu. Uvid\u00edme sa na Hydre!<\/p>\n<p><\/p>\n<blockquote><p>Pokra\u010dova\u0165 v komunik\u00e1cii s Cliffom bude mo\u017en\u00e9 na konferencii Hydra 2019, ktor\u00e1 sa uskuto\u010dn\u00ed 11.-12. j\u00fala 2019 v Petrohrade. Pr\u00edde s predn\u00e1\u0161kou <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.com\/2019\/talks\/2jix5mst7iduyp9linqhfj\/?utm_source=habr&amp;utm_medium=45871\">\u201eSk\u00fasenos\u0165 s pam\u00e4\u0165ou transakci\u00ed na hardv\u00e9ri Azul\u201c<\/a><\/noindex>. L\u00edstky si m\u00f4\u017eete zak\u00fapi\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.ru\/?utm_source=habr&amp;utm_medium=458718\">na ofici\u00e1lnych str\u00e1nkach<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/458718\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014 CTO \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Cratus (IoT \u0441\u0435\u043d\u0441\u043e\u0440\u044b \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432), \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0441\u043e\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u043e\u0432 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f Rocket Realtime School, Neurensic \u0438 H2O.ai) \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u043c\u0438 \u044d\u043a\u0437\u0438\u0442\u0430\u043c\u0438. \u041a\u043b\u0438\u0444\u0444 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 15 \u043b\u0435\u0442 (Pascal \u0434\u043b\u044f TRS Z-80)! \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u04212 \u0432 Java (the Sea of Nodes IR). \u042d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35851","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441 \u041a\u043b\u0438\u0444\u0444\u043e\u043c \u041a\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0442\u0446\u043e\u043c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 Java | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:03+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ve\u013ek\u00fd rozhovor s Cliffom Clickom \u2013 otcom JIT kompil\u00e1cie v Jave | ProHoster","description":"Cliff Click \u2013.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441 \u041a\u043b\u0438\u0444\u0444\u043e\u043c \u041a\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0442\u0446\u043e\u043c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 Java | ProHoster","og:description":"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:03+00:00","article:modified_time":"2019-10-31T19:07:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35851","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 01:01:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:55:25","updated":"2026-01-22 01:01:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/35851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=35851"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/35851\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=35851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=35851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=35851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}