wawancara hébat jeung Cliff Klik, bapana JIT kompilasi di Jawa

wawancara hébat jeung Cliff Klik, bapana JIT kompilasi di JawaCliff Klik - CTO of Cratus (IoT sensor pikeun perbaikan prosés), pangadeg jeung ko-pangadeg sababaraha startups (kaasup Rocket Realtime Sakola, Neurensic na H2O.ai) kalawan sababaraha kaluar suksés. Cliff nyerat kompiler kahijina dina yuswa 15 (Pascal pikeun TRS Z-80)! Anjeunna kasohor ku karyana dina C2 di Jawa (Laut Nodes IR). Kompiler ieu nunjukkeun ka dunya yén JIT tiasa ngahasilkeun kode kualitas luhur, anu mangrupikeun salah sahiji faktor munculna Java salaku salah sahiji platform parangkat lunak modéren utama. Lajeng Cliff mantuan Azul Systems ngawangun hiji mainframe 864-inti kalawan software Java murni nu ngarojong GC reureuhan dina tumpukan 500-gigabyte dina 10 milliseconds. Sacara umum, Cliff junun dianggo dina sagala aspek JVM.

 
habrapost Ieu wawancara hébat sareng Cliff. Urang bakal ngobrol ngeunaan topik di handap ieu:

  • Transisi ka optimasi tingkat low
  • Kumaha ngalakukeun refactoring badag
  • Modél ongkos
  • Latihan optimasi tingkat rendah
  • Conto praktis perbaikan kinerja
  • Naha nyieun basa programming anjeun sorangan
  • Karir Insinyur Performance
  • Tantangan Téknis
  • A saeutik ngeunaan register alokasi sarta multi-cores
  • Tantangan pangbadagna dina kahirupan

Wawancara dilaksanakeun ku:

  • Andrey Satarin ti Amazon Web Services. Dina karirna, anjeunna junun dianggo dina proyék lengkep béda: nguji NewSQL database disebarkeun di Yandex, sistem deteksi awan di Kaspersky Lab, kaulinan multiplayer di Mail.ru sarta jasa keur ngitung harga devisa di Deutsche Bank. Kabetot pikeun nguji backend skala ageung sareng sistem anu disebarkeun.
  • Vladimir Sitnikov ti Netcracker. Sapuluh taun gawé dina kinerja sarta scalability of NetCracker OS, software dipaké ku operator telecom pikeun ngajadikeun otomatis prosés manajemén jaringan jeung alat jaringan. Kabetot dina masalah kinerja Java sareng Oracle Database. Panulis langkung ti belasan perbaikan kinerja dina supir PostgreSQL JDBC resmi.

Transisi ka optimasi tingkat low

Андрей: Anjeun mangrupikeun nami ageung di dunya kompilasi JIT, Java, sareng pagelaran sacara umum, leres? 

gawir: Nya kitu!

Андрей: Hayu urang mimitian ku sababaraha patarosan umum ngeunaan karya kinerja. Kumaha saur anjeun ngeunaan pilihan antara optimasi tingkat luhur sareng tingkat rendah sapertos damel di tingkat CPU?

gawir: Sumuhun, sagalana basajan di dieu. Kodeu panggancangna nyaéta anu henteu pernah jalan. Kituna, anjeun salawasna kudu mimitian ti tingkat luhur, dianggo dina algoritma. A notasi O hadé bakal ngéléhkeun hiji notasi O goréng, iwal sababaraha konstanta cukup badag campur. Hal-hal tingkat handap jadi panungtungan. Biasana, upami anjeun parantos ngaoptimalkeun sesa tumpukan anjeun kalayan saé sareng masih aya sababaraha barang anu pikaresepeun, éta tingkat anu rendah. Tapi kumaha carana ngamimitian ti tingkat luhur? Kumaha anjeun terang yén cukup padamelan tingkat luhur parantos dilakukeun? Muhun... moal jalan. Henteu aya resep anu siap-siap. Anjeun kedah ngartos masalahna, mutuskeun naon anu anjeun badé laksanakeun (ku kituna henteu nyandak léngkah anu teu perlu di hareup) teras anjeun tiasa ngabongkar profiler, anu tiasa nyarios anu mangpaat. Dina sababaraha waktos, anjeun nyalira sadar yén anjeun parantos ngaleungitkeun hal-hal anu teu dipikabutuh sareng waktosna pikeun ngalakukeun sababaraha tuning tingkat rendah. Ieu pasti jenis husus tina seni. Aya seueur jalma anu ngalakukeun hal-hal anu teu dipikabutuh, tapi gancang-gancang aranjeunna henteu gaduh waktos hariwang ngeunaan produktivitas. Tapi ieu dugi patarosan timbul bluntly. Biasana 99% waktos teu aya anu paduli naon anu kuring laksanakeun, dugi ka momen nalika aya hal anu penting dina jalur kritis anu teu aya anu paduli. Sareng di dieu sadayana mimiti ngaganggu anjeun ngeunaan "naha éta henteu jalan sampurna ti mimiti." Sacara umum, aya salawasna hal pikeun ngaronjatkeun kinerja. Tapi 99% tina waktos anjeun teu gaduh kalungguhan! Anjeun ngan ukur nyobian damel sareng dina prosés anjeun terang naon anu penting. Anjeun moal pernah terang sateuacanna yén potongan ieu kedah sampurna, janten, kanyataanna, anjeun kedah sampurna dina sagala hal. Tapi ieu teu mungkin jeung anjeun teu ngalakukeun eta. Sok aya seueur hal anu kedah dilereskeun - sareng éta normal pisan.

Kumaha ngalakukeun refactoring badag

Андрей: Kumaha anjeun damel dina pagelaran? Ieu masalah cross-motong. Salaku conto, anjeun kantos kedah ngerjakeun masalah anu timbul tina simpang seueur fungsionalitas anu tos aya?

gawir: Abdi nyobian ngahindar. Upami kuring terang yén kinerja bakal janten masalah, kuring mikirkeun éta sateuacan kuring ngamimitian coding, khususna sareng struktur data. Tapi sering anjeun mendakan sadayana ieu engké. Lajeng anjeun kudu indit ka ukuran ekstrim jeung ngalakukeun naon kuring nelepon "tulisan deui jeung nalukkeun": Anjeun kudu grab sapotong cukup badag. Sababaraha kode masih kudu ditulis ulang alatan masalah kinerja atawa hal sejenna. Naon alesan pikeun nulis balik kode, éta ampir sok hadé nulis balik sapotong leuwih badag batan sapotong leutik. Dina momen ieu, saréréa mimiti oyag ku kasieun: "Ya Allah, anjeun moal tiasa nyabak seueur kode!" Tapi dina kanyataanana, pendekatan ieu ampir sok jalan leuwih hadé. Anjeun kudu geuwat nyandak masalah badag, ngagambar bunderan badag sabudeureun eta sarta ngomong: Kuring bakal nulis balik sagalana jero bunderan. Watesna langkung alit tibatan eusi di jerona anu kedah diganti. Tur upami delineation misalna tina wates ngidinan Anjeun pikeun ngalakukeun pagawean di jero sampurna, leungeun anjeun bébas, ngalakukeun naon rék. Sakali anjeun ngartos masalahna, prosés nulis balik leuwih gampang, jadi nyandak hiji kacamatan badag!
Dina waktos anu sami, nalika anjeun nyerat ulang anu ageung sareng sadar yén pagelaran bakal janten masalah, anjeun langsung tiasa hariwang ngeunaan éta. Ieu biasana janten hal-hal saderhana sapertos "ulah nyalin data, atur data sasederhana mungkin, jieun leutik." Dina nulis ulang badag, aya cara standar pikeun ngaronjatkeun kinerja. Jeung maranéhna ampir sok revolve sabudeureun data.

Modél ongkos

Андрей: Dina salah sahiji podcast anjeun dikaitkeun model ongkos dina konteks produktivitas. Naha anjeun tiasa ngajelaskeun naon anu anjeun maksud ku ieu?

gawir: Tangtu. Kuring lahir di jaman nalika kinerja prosesor penting pisan. Jeung jaman ieu balik deui - nasib teu tanpa ironi. Kuring mimiti hirup dina jaman mesin dalapan bit; komputer munggaran kuring damel sareng 256 bait. Persis bait. Sagalana éta pisan leutik. Parentah kedah diitung, sareng nalika urang ngamimitian naék tumpukan basa pamrograman, basa-basa éta beuki seueur. Aya Assembler, teras Dasar, teras C, sareng C ngurus seueur detil, sapertos daptar alokasi sareng pamilihan instruksi. Tapi sagalana éta rada jelas aya, sarta lamun kuring dijieun pointer kana hiji conto variabel, lajeng abdi bakal meunang beban, sarta biaya instruksi ieu dipikawanoh. Hardware ngahasilkeun sajumlah siklus mesin, ku kituna laju palaksanaan hal-hal anu béda-béda tiasa diitung ngan ukur ku nambihan sadaya petunjuk anu anjeun badé jalankeun. Unggal ngabandingkeun / test / cabang / nelepon / beban / toko bisa ditambahkeun jeung ceuk: éta waktu palaksanaan pikeun anjeun. Lamun dipake dina ngaronjatkeun kinerja, anjeun pasti bakal nengetan naon angka pakait jeung siklus panas leutik. 
Tapi pas anjeun pindah ka Java, Python jeung hal sarupa, anjeun gancang pisan ngajauhan hardware-tingkat low. Sabaraha biaya nelepon getter di Jawa? Upami JIT di HotSpot leres inline, eta bakal ngamuat, tapi lamun teu ngalakukeun ieu, eta bakal fungsi panggero. Kusabab télépon dina loop panas, éta bakal override sadayana optimizations sejenna dina loop éta. Ku alatan éta, biaya nyata bakal leuwih luhur. Jeung anjeun langsung leungit kamampuhan pikeun nempo sapotong kode jeung ngarti yén urang kudu ngaéksekusi eta dina watesan processor speed jam, memori jeung cache dipaké. Sadaya ieu janten pikaresepeun ngan upami anjeun leres-leres asup kana pagelaran.
Ayeuna urang mendakan diri dina kaayaan dimana kecepatan prosésor boro ningkat salami dasawarsa. Jaman baheula deui! Anjeun teu tiasa deui ngandelkeun kinerja single-threaded anu saé. Tapi lamun ujug-ujug meunang kana komputasi paralel, éta incredibly hésé, dulur Sigana di anjeun kawas James Bond. Akselerasi sapuluh kali lipat di dieu biasana lumangsung di tempat-tempat anu aya anu ngaganggu. Concurrency merlukeun loba karya. Pikeun ngagancangkeun XNUMXx éta, anjeun kedah ngartos modél biaya. Naon jeung sabaraha hargana? Sareng pikeun ngalakukeun ieu, anjeun kedah ngartos kumaha létah pas dina hardware anu aya.
Martin Thompson milih kecap anu saé pikeun blog na Simpati mékanis! Anjeun kedah ngartos naon hardware anu bade ngalakukeun, kumaha kahayang eta bakal ngalakukeun eta, sarta naha hancana naon hancana di tempat munggaran. Ngagunakeun ieu, éta cukup gampang pikeun ngamimitian cacah parentah jeung figuring kaluar dimana waktos palaksanaan bade. Upami anjeun henteu ngagaduhan latihan anu pas, anjeun ngan ukur milarian ucing hideung di kamar anu poék. Kuring ningali jalma-jalma ngaoptimalkeun kinerja sepanjang waktos anu henteu terang naon anu aranjeunna lakukeun. Aranjeunna sangsara pisan jeung teu nyieun loba kamajuan. Sareng nalika kuring nyandak potongan kode anu sami, lebetkeun sababaraha hacks leutik sareng kéngingkeun speedup lima atanapi sapuluh lipet, aranjeunna sapertos: saé, éta henteu adil, kami parantos terang anjeun langkung saé. Endah. Naon keur kuring ngawangkong ngeunaan ... model ongkos nyaeta ngeunaan jenis kode anjeun nulis na sabaraha gancang eta ngalir rata-rata dina big picture.

Андрей: Sareng kumaha anjeun tiasa ngajaga volume sapertos kitu dina sirah anjeun? Naha ieu kahontal kalayan langkung seueur pangalaman, atanapi? Ti mana pangalaman kitu?

gawir: Nya, kuring henteu ngagaduhan pangalaman dina cara anu paling gampang. Kuring diprogram di Majelis deui dina poé nalika anjeun bisa ngarti unggal instruksi tunggal. Keur disada bodo, tapi saprak éta set instruksi Z80 salawasna tetep dina sirah kuring, dina mémori kuring. Kuring teu apal ngaran jalma dina hiji menit ngobrol, tapi kuring inget kode ditulis 40 taun ka tukang. Ieu lucu, sigana sapertos sindrom "élmuwan bodo".

Latihan optimasi tingkat rendah

Андрей: Aya cara nu leuwih gampang pikeun asup?

gawir: Enya jeung henteu. Parangkat keras anu urang sadayana anggo teu acan robih pisan kana waktosna. Sarerea ngagunakeun x86, iwal smartphone Arm. Upami anjeun henteu ngalakukeun sababaraha jinis hardcore embedding, anjeun ngalakukeun hal anu sami. Oké, salajengna. Parentah oge teu robah mangabad-abad. Anjeun kudu indit jeung nulis hiji hal di Majelis. Teu pira, tapi cukup pikeun ngawitan ngartos. Anjeun seuri, tapi kuring nyarios sacara serius. Anjeun kedah ngartos susuratan antara basa sareng hardware. Sanggeus éta anjeun kudu indit jeung nulis saeutik jeung nyieun kompiler kaulinan saeutik pikeun basa kaulinan saeutik. Sapertos kaulinan hartosna éta kedah dilakukeun dina waktos anu lumayan. Bisa jadi super basajan, tapi kudu ngahasilkeun parentah. Kalakuan ngahasilkeun hiji instruksi baris mantuan anjeun ngartos model ongkos pikeun sasak antara kode-tingkat tinggi nu dulur nyerat jeung kode mesin nu dijalankeun dina hardware. Susuratan ieu bakal diduruk kana uteuk nalika kompiler ditulis. Komo kompiler pangbasajanna. Saatos éta, anjeun tiasa ngamimitian ningali Java sareng kanyataan yén jurang semantisna langkung jero, sareng langkung sesah ngawangun sasak di dinya. Di Jawa, langkung hese ngartos naha sasak urang tétéla saé atanapi goréng, naon anu bakal nyababkeun éta runtuh sareng naon anu henteu. Tapi anjeun peryogi sababaraha jinis titik awal dimana anjeun ningali kode sareng ngartos: "Leres, getter ieu kedah digaris unggal waktos." Lajeng tétéla yén kadang ieu kajadian, iwal kaayaan nalika metoda janten badag teuing, sarta JIT dimimitian inlining sagalana. Kinerja tempat sapertos kitu tiasa diprediksi langsung. Biasana getters dianggo ogé, tapi lajeng nu katingali puteran panas badag tur nyadar yén aya sababaraha fungsi panggero floating sabudeureun aya nu teu nyaho naon maranéhna ngalakukeun. Ieu masalah jeung pamakéan nyebar getters, alesan naha maranéhna teu inlined téh nya éta teu jelas naha éta getter a. Upami Anjeun gaduh basa kode super leutik, Anjeun saukur tiasa nginget eta lajeng nyebutkeun: ieu getter a, sarta ieu setter a. Dina basa kode badag, unggal fungsi hirup sajarah sorangan, nu, sacara umum, teu dipikawanoh ka saha. Profiler nyebutkeun yen urang leungit 24% waktu dina sababaraha loop sarta ngartos naon loop ieu lakukeun, urang kudu ningali unggal fungsi di jero. Teu mungkin ngartos ieu tanpa diajar fungsi, sarta ieu serius slows turun prosés pamahaman. Éta sababna kuring henteu nganggo getter sareng setters, kuring parantos ngahontal tingkat anu énggal!
Dimana kéngingkeun modél biaya? Muhun, Anjeun bisa maca hiji hal, tangtosna ... Tapi kuring pikir cara pangalusna nyaéta meta. Ngadamel kompiler leutik bakal janten cara anu pangsaéna pikeun ngartos modél biaya sareng nyocogkeun kana sirah anjeun nyalira. Kompiler leutik anu cocog pikeun program gelombang mikro mangrupikeun tugas pikeun pamula. Nya, maksad abdi, upami anjeun parantos gaduh kaahlian pemrograman, maka éta kedah cekap. Sadaya hal ieu sapertos parsing string anu anjeun gaduh salaku sababaraha jinis éksprési aljabar, ékstrak paréntah pikeun operasi matematik ti dinya dina urutan anu leres, nyandak nilai anu leres tina register - sadayana ieu dilakukeun sakaligus. Sareng nalika anjeun ngalakukeun éta, éta bakal dicitak dina uteuk anjeun. Jigana everyone weruh naon compiler a. Sareng ieu bakal masihan pamahaman ngeunaan modél biaya.

Conto praktis perbaikan kinerja

Андрей: Naon deui anu kedah diperhatoskeun nalika ngerjakeun produktivitas?

gawir: Struktur data. Ku jalan kitu, enya, kuring geus lila teu ngajar kelas ieu ... Sakola Rokét. Ieu senang, tapi diperlukeun loba usaha , sarta kuring ogé boga hirup a! OKÉ. Janten, dina salah sahiji kelas anu ageung sareng pikaresepeun, "Kamana prestasi anjeun," kuring masihan murid conto: dua satengah gigabyte data fintech dibaca tina file CSV teras aranjeunna kedah ngitung jumlah produk anu dijual. . Data pasar centang biasa. Paket UDP dirobih kana format téks ti taun 70an. Chicago Mercantile Exchange - sagala rupa hal kawas mentega, jagong, Kacang Kedelai, hal kawas éta. Perlu ngitung produk ieu, jumlah transaksi, volume rata-rata gerakan dana sareng barang, jsb. Matematika dagang anu saderhana pisan: milarian kode produk (éta 1-2 karakter dina tabel hash), kéngingkeun jumlahna, tambahkeun kana salah sahiji set dagang, tambahkeun volume, tambahkeun nilai, sareng sababaraha hal anu sanés. Matematika basajan pisan. Palaksanaan kaulinan éta pisan lugas: sagalana aya dina file a, Kuring maca file jeung mindahkeun ngaliwatan eta, ngabagi rékaman individu kana string Java, pilari hal diperlukeun dina éta sarta nambahan aranjeunna nepi nurutkeun kana matematik ditétélakeun di luhur. Sarta gawéna dina sababaraha speed low.

Kalayan pendekatan ieu, écés naon anu lumangsung, sareng komputasi paralel moal ngabantosan, sanés? Tétéla yén kanaékan lima kali lipat dina kinerja bisa dihontal saukur ku milih struktur data katuhu. Sarta ieu kaget malah programer ngalaman! Dina hal husus kuring, trik ieu nu teu kudu nyieun alokasi memori dina loop panas. Nya, ieu sanés sadayana kabeneran, tapi sacara umum - anjeun henteu kedah nyorot "sakali dina X" nalika X cukup ageung. Nalika X dua satengah gigabyte, anjeun teu kedah ngalokasikeun naon waé "sakali per huruf", atanapi "sakali per baris", atanapi "sakali per widang", sapertos kitu. Ieu dimana waktos spent. Kumaha ieu malah dianggo? Bayangkeun kuring nelepon String.split() atawa BufferedReader.readLine(). Readline ngajadikeun string ti susunan bait nu datang ngaliwatan jaringan, sakali pikeun tiap garis, pikeun tiap tina ratusan jutaan garis. Kuring nyokot garis ieu, parse eta jeung buang eta jauh. Naha kuring ngalungkeun éta - muhun, kuring parantos ngolah éta, éta waé. Janten, pikeun tiap bait anu dibaca tina 2.7G ieu, dua karakter bakal diserat dina garis, nyaéta, parantos 5.4G, sareng kuring henteu peryogi naon waé deui, ku kituna aranjeunna dialungkeun. Lamun nempo rubakpita memori, urang ngamuat 2.7G nu mana ngaliwatan mémori jeung beus memori dina processor, lajeng dua kali leuwih dikirim ka garis bohong dina mémori, sarta sakabeh ieu frayed nalika unggal garis anyar dijieun. Tapi kuring kudu maca eta, hardware maca eta, sanajan sagalana geus frayed engké. Sareng kuring kedah nyerat éta kusabab kuring nyiptakeun garis sareng cache pinuh - cache henteu tiasa nampung 2.7G. Janten, pikeun unggal bait anu kuring baca, kuring maca dua bait deui sareng nyerat dua bait deui, sareng tungtungna aranjeunna gaduh rasio 4: 1 - dina rasio ieu kami ngabuang bandwidth memori. Lajeng tétéla yén lamun kuring ngalakukeun String.split() - ieu teu panungtungan waktu kuring ngalakukeun ieu, meureun aya 6-7 widang sejen di jero. Janten kodeu klasik pikeun maca CSV teras nga-parsing senar ngabuang sakitar 14: 1 tina bandwidth memori anu anjeun pikahoyong. Upami anjeun miceun pilihan ieu, anjeun tiasa kéngingkeun ngagancangkeun lima kali.

Sareng éta henteu sesah. Upami anjeun ningali kodeu tina sudut anu leres, éta sadayana janten saderhana nalika anjeun sadar masalahna. Anjeun teu kudu eureun allocating memori sakabehna: hijina masalah nyaeta nu allocate hal sarta eta langsung maot, sarta sapanjang jalan eta kaduruk hiji sumberdaya penting, nu dina hal ieu bandwidth memori. Sareng sadaya ieu nyababkeun panurunan dina produktivitas. Dina x86 anjeun biasana kudu aktip kaduruk siklus prosésor, tapi di dieu anjeun dibeuleum nepi sagala memori loba saméméhna. Solusina nyaéta ngirangan jumlah tuangeun. 
Bagian séjén tina masalah éta lamun ngajalankeun profiler nalika belang memori béak, katuhu lamun eta kajadian, Anjeun biasana ngantosan cache datang deui sabab pinuh ku sampah nu ngan dihasilkeun, sakabeh garis eta. Ku alatan éta, unggal beban atawa toko operasi jadi slow, sabab ngakibatkeun cache misses - sakabéh cache geus jadi slow, ngantosan sampah ninggalkeun eta. Ku alatan éta, profiler ngan bakal nembongkeun noise acak haneut smeared sakuliah sakabéh loop - moal aya instruksi panas misah atawa tempat dina kode. Ukur ribut. Sareng upami anjeun ningali siklus GC, aranjeunna sadayana Generasi Muda sareng super gancang - microseconds atanapi milliseconds maksimal. Barina ogé, sadaya memori ieu maot instan. Anjeun allocate milyaran gigabyte, sarta anjeunna motong aranjeunna, sarta motong aranjeunna, sarta motong aranjeunna deui. Sadaya ieu lumangsung gancang pisan. Tétéla aya siklus GC mirah, noise haneut sapanjang sakabéh siklus, tapi urang hayang meunang speedup 5x. Dina momen ieu, hal kudu nutup dina sirah anjeun sarta sora: "naha ieu ?!" Mémori strip ngabahekeun teu dipintonkeun dina debugger Palasik; Anjeun kudu ngajalankeun kinerja hardware counter debugger tur tingal eta sorangan tur langsung. Tapi ieu teu bisa langsung disangka tina tilu gejala ieu. Gejala katilu nyaéta nalika anjeun ningali naon anu anjeun sorot, naroskeun ka profiler, sareng anjeunna ngajawab: "Anjeun ngadamel samilyar barisan, tapi GC damel gratis." Pas ieu kajadian, anjeun nyadar yén anjeun geus dijieun loba teuing objék jeung kaduruk nepi sakabéh jalur memori. Aya cara pikeun terang ieu, tapi henteu écés. 

Masalahna aya dina struktur data: struktur bulistir kaayaan sagalana yén kajadian, éta badag teuing, éta 2.7G on disk, jadi nyieun salinan hal ieu pisan pikaresepeun - Anjeun hoyong ngamuat tina panyangga bait jaringan langsung. kana registers, ku kituna teu maca-tulis kana garis bulak-balik lima kali. Hanjakalna, Java henteu masihan anjeun perpustakaan sapertos bagian tina JDK sacara standar. Tapi ieu téh trivial, katuhu? Intina, ieu 5-10 garis kode anu bakal dipaké pikeun nerapkeun panyangga string loader sorangan, nu repeats kabiasaan kelas string, bari keur wrapper sabudeureun panyangga bait kaayaan. Hasilna, tétéla yén anjeun damel ampir saolah-olah nganggo senar, tapi dina kanyataanana pointer ka panyangga pindah ka dinya, sareng bait atah henteu disalin dimana waé, sahingga panyangga anu sami dianggo deui, sareng deui. sistem operasi senang nyandak on diri hal eta dirancang pikeun, kawas disumputkeun ganda-buffering tina panyangga bait ieu, jeung anjeun euweuh grinding ngaliwatan aliran data teu perlu. Ngomong-ngomong, anjeun ngartos yén nalika damel sareng GC, dijamin yén unggal alokasi mémori moal katingali ku prosesor saatos siklus GC anu terakhir? Ku alatan éta, sakabéh ieu teu mungkin dina cache nu, lajeng a 100% dijamin miss lumangsung. Nalika digawé kalayan pointer a, on x86, subtracting a register ti memori nyokot 1-2 siklus jam, jeung pas ieu kajadian, Anjeun mayar, mayar, mayar, sabab mémori téh sadayana on. NINE caches - sareng ieu mangrupikeun biaya alokasi mémori. nilai nyata.

Dina basa sejen, struktur data mangrupa hal hardest robah. Sareng nalika anjeun sadar yén anjeun parantos milih struktur data anu salah anu bakal maéhan kinerja engké, biasana seueur padamelan anu kedah dilakukeun, tapi upami henteu, hal-hal bakal parah. Anu mimiti, anjeun kedah mikir ngeunaan struktur data, ieu penting. Biaya utama di dieu digolongkeun kana struktur data gajih, anu mimiti dianggo dina gaya "Kuring nyalin struktur data X kana struktur data Y sabab kuring resep bentuk Y langkung saé." Tapi operasi nyalin (anu sigana mirah) sabenerna wastes rubakpita memori sarta éta tempat sagala waktos palaksanaan wasted dikubur. Upami kuring gaduh senar raksasa JSON sareng kuring hoyong janten tangkal DOM terstruktur tina POJOs atanapi naon waé, operasi parsing senar éta sareng ngawangun POJO, teras ngaksés POJO deui engké, bakal ngahasilkeun biaya anu teu perlu - éta teu mirah. Iwal mun anjeun ngajalankeun sabudeureun POJOs pisan leuwih sering ti anjeun ngajalankeun sabudeureun string a. Offhand, Anjeun gantina bisa nyoba ngadekrip string jeung nimba ngan naon nu peryogi ti dinya, tanpa ngarobahna kana POJO wae. Lamun kabeh ieu kajadian dina jalur ti mana kinerja maksimum diperlukeun, euweuh POJOs pikeun anjeun, anjeun kudu kumaha bae ngagali kana garis langsung.

Naha nyieun basa programming anjeun sorangan

Андрей: Anjeun nyarios yén pikeun ngartos modél biaya, anjeun kedah nyerat basa sakedik anjeun ...

gawir: Teu basa, tapi compiler. Basa sareng kompiler mangrupikeun dua hal anu béda. Beda pangpentingna dina sirah anjeun. 

Андрей: Ku jalan kitu, sajauh kuring nyaho, anjeun experimenting kalawan nyieun basa anjeun sorangan. Kanggo naon?

gawir: Sabab abdi tiasa! Abdi semi-pensiun, janten ieu hobi abdi. Kuring parantos ngalaksanakeun basa batur sapanjang hirup kuring. Kuring ogé digawé pisan dina gaya coding kuring. Sareng ogé kusabab kuring ningali masalah dina basa sanés. Kuring nempo yén aya cara hadé pikeun ngalakukeun hal akrab. Sareng kuring bakal ngagunakeunana. Abdi ngan ukur bosen ningali masalah dina diri kuring, dina Java, dina Python, dina basa sanés. Kuring ayeuna nyerat dina React Native, JavaScript sareng Elm salaku hobi anu sanés ngeunaan pangsiun, tapi ngeunaan padamelan anu aktip. Kuring ogé nulis dina Python jeung, paling dipikaresep, bakal neruskeun gawé dina mesin learning pikeun backends Java. Aya seueur basa populér sareng aranjeunna sadayana gaduh fitur anu pikaresepeun. Sarerea alus ku cara sorangan sareng anjeun tiasa nyobian ngahijikeun sadaya fitur ieu. Janten, kuring ngulik hal-hal anu dipikaresep ku kuring, paripolah basa, nyobian ngadamel semantik anu wajar. Sareng dugi ka ayeuna kuring suksés! Di momen Kuring keur berjuang jeung semantik memori, sabab Abdi hoyong gaduh eta kawas dina C jeung Java, sarta meunang modél memori kuat sarta semantik memori pikeun beban sarta toko. Dina waktos anu sami, gaduh inferensi jinis otomatis sapertos dina Haskell. Di dieu, abdi nyobian nyampur inferensi tipe Haskell-kawas kalawan karya memori dina duanana C jeung Java. Ieu naon anu kuring lakukeun salami 2-3 sasih, contona.

Андрей: Upami anjeun ngawangun basa anu nyandak aspék anu langkung saé tina basa sanés, naha anjeun nyangka yén batur bakal ngalakukeun sabalikna: nyandak ideu anjeun sareng dianggo?

gawir: Ieu persis kumaha basa anyar muncul! Naha Java sami sareng C? Kusabab C kungsi sintaksis alus nu dulur dipikaharti sarta Java diideuan ku sintaksis ieu, nambahkeun kaamanan tipe, Asép Sunandar Sunarya mariksa wates, GC, sarta aranjeunna ogé ningkat sababaraha hal ti C. Aranjeunna ditambahkeun sorangan. Tapi aranjeunna diideuan pisan, leres? Sarerea nangtung dina taktak raksasa anu sumping sateuacan anjeun - éta kumaha kamajuan dilakukeun.

Андрей: Salaku I ngartos eta, basa anjeun bakal memori aman. Dupi anjeun mikir ngeunaan ngalaksanakeun hal kawas checker injeuman ti Rust? Dupi anjeun melong anjeunna, naon anu anjeun pikir ngeunaan anjeunna?

gawir: Muhun, Kuring geus nulis C keur umur, kalayan sagala malloc ieu tur haratis, sarta sacara manual ngatur hirupna. Anjeun terang, 90-95% tina waktos hirup dikawasa sacara manual gaduh struktur anu sami. Sareng éta pisan, nyeri pisan pikeun ngalakukeunana sacara manual. Abdi hoyong kompiler ngan ukur nyarioskeun ka anjeun naon anu aya di dinya sareng naon anu anjeun laksanakeun ku lampah anjeun. Pikeun sababaraha hal, injeuman Checker ngalakukeun ieu out of the box. Sarta eta kedah otomatis nembongkeun informasi, ngartos sagalana, komo teu beungbeurat kuring jeung presenting pamahaman ieu. Éta kedah ngalakukeun sahenteuna analisa kabur lokal, sareng ngan upami gagal, maka éta kedah nambihan anotasi jinis anu bakal ngajelaskeun umur hirup - sareng skéma sapertos kitu langkung rumit tibatan pamariksaan injeuman, atanapi leres-leres pamariksaan mémori anu aya. Pilihan antara "sadayana henteu kunanaon" sareng "Kuring henteu ngartos nanaon" - henteu, kedah aya anu langkung saé. 
Janten, salaku jalma anu parantos nyerat seueur kode dina C, kuring nyangka yén gaduh dukungan pikeun kontrol hirup otomatis mangrupikeun hal anu paling penting. Kuring ogé fed up kalawan sabaraha Java migunakeun memori jeung keluhan utama GC. Lamun anjeun allocate memori dina Java, Anjeun moal meunang deui memori nu éta lokal dina siklus GC panungtungan. Ieu sanés kasus dina basa anu gaduh manajemén mémori anu langkung tepat. Upami anjeun nyauran malloc, anjeun langsung kéngingkeun mémori anu biasa dianggo. Biasana anjeun ngalakukeun sababaraha hal samentawis sareng mémori sareng langsung uih deui. Sarta eta geuwat balik deui ka kolam renang malloc, sarta siklus malloc salajengna narik kaluar deui. Ku alatan éta, pamakéan memori sabenerna diréduksi jadi susunan objék hirup dina waktu nu tangtu, ditambah leaks. Tur upami sagalana teu bocor dina cara lengkep teu sopan, lolobana mémori ends up dina caches na processor, sarta gawéna gancang. Tapi merlukeun loba manajemén memori manual kalawan malloc na bebas disebut dina urutan katuhu, dina tempat katuhu. Karat tiasa ngadamel ieu leres on sorangan, sarta dina loba kasus masihan kinerja malah hadé, saprak konsumsi memori narrowed handap pikeun ngan itungan ayeuna - sabalikna ngantosan siklus GC salajengna pikeun memori bébas. Hasilna, urang meunang cara pisan metot pikeun ngaronjatkeun kinerja. Sareng cukup kuat - Maksad abdi, kuring ngalakukeun hal-hal sapertos nalika ngolah data pikeun fintech, sareng ieu ngamungkinkeun kuring kéngingkeun speedup sakitar lima kali. Éta dorongan anu lumayan ageung, khususna di dunya dimana prosesor henteu langkung gancang sareng kami masih ngantosan perbaikan.

Karir Insinyur Performance

Андрей: Abdi ogé hoyong naroskeun ngeunaan karir sacara umum. Anjeun naros ka prominence kalawan gawé JIT anjeun di HotSpot lajeng dipindahkeun ka Azul, nu ogé mangrupa parusahaan JVM. Tapi kami parantos damel langkung seueur kana hardware tibatan parangkat lunak. Teras aranjeunna ujug-ujug ngalih ka Big Data sareng Machine Learning, teras ka deteksi panipuan. Kumaha ieu kajadian? Ieu mangrupikeun daérah pangwangunan anu béda pisan.

gawir: Kuring geus programming pikeun rada lila sarta geus junun nyandak loba kelas béda. Sareng nalika jalma nyarios: "Oh, anjeun anu ngadamel JIT pikeun Java!", éta sok lucu. Tapi sateuacan éta, kuring damel dina klon PostScript - basa anu kantos dianggo Apple pikeun panyitak laser na. Sareng sateuacan éta kuring ngalaksanakeun palaksanaan basa Kaopat. Jigana téma umum pikeun kuring nyaéta pamekaran alat. Sapanjang hirup kuring, kuring parantos ngadamel alat anu dianggo ku jalma sanés nyerat program anu saé. Tapi kuring ogé kalibet dina ngembangkeun sistem operasi, drivers, debuggers kernel-tingkat, basa pikeun ngembangkeun OS, nu dimimitian kaluar trivial, tapi kana waktu jadi beuki loba kompléks. Tapi topik utama masih ngembangkeun alat. Bagian badag tina kahirupan kuring diliwatan antara Azul jeung Sun, sarta éta ngeunaan Jawa. Tapi nalika kuring asup kana Big Data sareng Machine Learning, kuring nempatkeun deui topi mewah kuring sareng nyarios, "Oh, ayeuna urang gaduh masalah anu teu pati penting, sareng aya seueur hal anu pikaresepeun sareng jalma-jalma ngalakukeun hal-hal." Ieu mangrupikeun jalan pangembangan anu saé.

Leres, kuring resep pisan komputasi disebarkeun. Pakasaban munggaran abdi salaku mahasiswa di C, dina hiji proyék iklan. Ieu disebarkeun komputasi on Zilog Z80 chip nu dikumpulkeun data pikeun OCR analog, dihasilkeun ku analyzer analog nyata. Ieu topik tiis tur sagemblengna gélo. Tapi aya masalah, sababaraha bagian teu dipikawanoh leres, jadi Anjeun kudu nyandak kaluar gambar sarta némbongkeun ka jalma anu geus bisa maca kalawan panon maranéhanana sarta ngalaporkeun naon cenah, sarta ku kituna aya jobs kalawan data, sarta jobs ieu. miboga basa sorangan. Aya backend nu ngolah sadayana ieu - Z80s ngajalankeun sajajar jeung vt100 terminal ngajalankeun - hiji per jalma, tur aya model programming paralel on Z80. Sababaraha sapotong umum memori dibagikeun ku sakabeh Z80s dina konfigurasi béntang; backplane ieu ogé dibagikeun, sarta satengah tina RAM ieu dibagikeun dina jaringan, sarta satengah séjén éta swasta atawa indit ka hal sejenna. Hiji sistem disebarkeun paralel meaningfully kompléks kalawan dibagikeun ... memori semi-dibagikeun. Nalika ieu ... Kuring malah teu bisa apal, wae dina pertengahan 80s. Rada lila pisan. 
Leres, anggap yén 30 taun parantos lami pisan. Masalah anu aya hubunganana sareng komputasi terdistribusi parantos lami aya, jalma-jalma parantos lami perang sareng Beowulf- klaster. klaster sapertos kasampak kawas ... Contona: aya Ethernet jeung x86 gancang anjeun disambungkeun ka Ethernet ieu, tur ayeuna rék meunang memori dibagikeun palsu, sabab teu saurang ogé bisa ngalakukeun coding komputasi disebarkeun lajeng, éta hésé teuing sahingga aya. éta palsu memori dibagikeun kalawan kaca memori panyalindungan dina x86, sarta lamun nulis ka kaca ieu, lajeng kami ngawartoskeun prosesor séjén yén lamun maranéhna ngakses memori dibagikeun sarua, eta bakal perlu dimuat ti anjeun, sahingga hal kawas protokol pikeun ngarojong. kohérénsi cache muncul sareng parangkat lunak pikeun ieu. Konsep metot. Masalah sabenerna, tangtosna, éta hal sejenna. Sadaya ieu tiasa dianggo, tapi anjeun gancang ngagaduhan masalah kinerja, sabab teu aya anu ngartos modél kinerja dina tingkat anu cekap - naon pola aksés mémori anu aya, kumaha carana mastikeun yén titik-titik henteu saling ping, sareng saterasna.

Naon anu kuring datang dina H2O nyaéta yén pamekar sorangan anu tanggung jawab pikeun nangtukeun dimana paralelisme disumputkeun sareng dimana henteu. Kuring datang nepi ka model coding nu nyieun nulis kode-kinerja tinggi gampang tur basajan. Tapi nulis kode slow-ngajalankeun hese, bakal kasampak goréng. Anjeun kedah serius nyobian nyerat kode anu laun, anjeun kedah nganggo metode non-standar. Kode ngerem katingali dina glance kahiji. Hasilna, anjeun biasana nulis kode nu ngalir gancang, tapi anjeun kudu angka kaluar naon anu kudu dipigawé dina kasus memori dibagikeun. Sadaya ieu dihijikeun ka arrays badag sarta kabiasaan aya sarupa arrays badag non-volatile di paralel Java. Maksad abdi, ngabayangkeun yén dua threads nulis ka Asép Sunandar Sunarya paralel, salah sahijina ngéléhkeun , jeung lianna, sasuai, leungit, jeung anjeun teu nyaho nu mana. Upami aranjeunna henteu volatile, maka pesenan tiasa janten naon waé anu anjeun pikahoyong - sareng ieu jalanna saé pisan. Jalma bener paduli urutan operasi, aranjeunna nempatkeun volatile di tempat katuhu, sarta aranjeunna nyangka masalah kinerja patali memori di tempat katuhu. Upami teu kitu, aranjeunna ngan saukur bakal nulis kode dina bentuk puteran ti 1 nepi ka N, dimana N sababaraha triliun, dina harepan yén sakabéh pajeulitna bakal otomatis jadi paralel - na teu dianggo di dinya. Tapi dina H2O ieu sanés Java atanapi Scala; anjeun tiasa nganggap éta "Java minus minus" upami anjeun hoyong. Ieu mangrupikeun gaya pemrograman anu jelas pisan sareng sami sareng nyerat kode C atanapi Java anu sederhana sareng puteran sareng susunan. Tapi dina waktos anu sami, mémori tiasa diolah dina terabytes. Kuring masih ngagunakeun H2O. Kuring make eta ti jaman ka jaman dina proyék béda - sarta masih mangrupa hal panggancangna, puluhan kali leuwih gancang ti pesaing na. Upami anjeun ngalakukeun Big Data sareng data columnar, sesah pisan pikeun ngéléhkeun H2O.

Tantangan Téknis

Андрей: Naon tantangan pangbadagna anjeun dina sakabéh karir Anjeun?

gawir: Naha urang ngabahas bagian teknis atanapi non-teknis tina masalah? Kuring bakal nyebutkeun tantangan pangbadagna teu leuwih teknis. 
Sedengkeun pikeun tantangan teknis. Kuring ngan saukur ngéléhkeun maranéhna. Kuring malah henteu terang naon anu pangageungna, tapi aya sababaraha anu pikaresepeun anu nyandak waktos sakedik, perjuangan mental. Nalika kuring indit ka Sun, Kuring yakin yén kuring bakal nyieun hiji kompiler gancang, sarta kebat manula ceuk dina respon yén kuring pernah bakal sukses. Tapi kuring dituturkeun jalur ieu, wrote compiler a handap ka allocator register, tur éta rada gancang. Ieu sagancangna C1 modern, tapi allocator éta leuwih laun deui lajeng, sarta di hindsight éta masalah struktur data badag. Kuring diperlukeun eta nulis allocator register grafis jeung Abdi teu ngartos dilema antara kode expressiveness jeung speed, nu eksis di jaman éta sarta pohara penting. Tétéla yén struktur data biasana ngaleuwihan ukuran cache on x86s waktu éta, sarta ku kituna, lamun mimitina kuring nganggap yén allocator register bakal dianggo kaluar 5-10 persén tina total waktu jitter, teras kanyataanana tétéla éta. 50 persen.

Salaku waktu nuluykeun, compiler janten cleaner tur leuwih efisien, dieureunkeun generating kode dahsyat dina leuwih kasus, sarta kinerja beuki mimiti nyarupaan naon a kompiler C. Iwal, tangtosna, anjeun nulis sababaraha crap yén sanajan C teu speeds up. . Upami anjeun nyerat kode sapertos C, anjeun bakal nampi prestasi sapertos C dina sababaraha kasus. Jeung salajengna anjeun indit, beuki sering anjeun meunang kode nu asymptotically coincided jeung tingkat C, allocator register mimiti kasampak kawas hal lengkep ... paduli naha kode anjeun ngajalankeun gancang atawa slow. Kuring terus dianggo dina allocator pikeun nyieun pilihan hadé. Anjeunna janten langkung laun sareng laun, tapi anjeunna masihan prestasi anu langkung saé sareng langkung saé dina kasus anu teu aya anu sanés tiasa ngatasi. Kuring bisa teuleum ka allocator register, ngubur sabulan gawé aya, sarta ujug-ujug sakabeh kode bakal ngamimitian executing 5% leuwih gancang. Ieu kajantenan waktos-waktos sareng alokasi pendaptaran janten karya seni - sadayana dipikacinta atanapi benci, sareng jalma-jalma ti akademi naroskeun patarosan ngeunaan topik "naha sadayana dilakukeun ku cara kieu", naha henteu. scan garis, jeung naon bédana. Dina jawaban eta masih sami: hiji allocator dumasar kana ngawarnaan grafik tambah ati pisan karya kalawan kode panyangga sarua jeung pakarang kameunangan , kombinasi pangalusna nu teu saurang ogé bisa ngéléhkeun . Sareng ieu mangrupikeun hal anu teu jelas. Sagalana sejenna nu compiler ngalakukeun aya hal anu cukup well-diulik, sanajan maranéhna ogé geus dibawa ka tingkat seni. Kuring sok ngalakukeun hal-hal anu sakuduna ngajantenkeun kompiler janten karya seni. Tapi euweuh ieu nanaon luar biasa - iwal allocator register. trik ieu kudu ati ditegor handapeun beban na, lamun ieu kajadian (Kuring bisa ngajelaskeun leuwih jéntré lamun kabetot), ieu ngandung harti yén anjeun bisa inline leuwih aggressively, tanpa résiko ragrag leuwih hiji kink dina jadwal kinerja. Dina éta poé, aya kebat compiler skala pinuh, ngagantung kalawan baubles na whistles, nu kungsi ngadaptar allocators, tapi teu saurang ogé bisa ngalakukeun eta.

Masalahna nyaéta upami anjeun nambihan metode anu tunduk kana inlining, ningkatkeun sareng ningkatkeun daérah inlining, set nilai anu dianggo langsung ngaleuwihan jumlah register, sareng anjeun kedah motong aranjeunna. Tingkat kritis biasana asalna nalika allocator nyerah, sarta salah sahiji calon alus pikeun ngabahekeun patut sejen, anjeun bakal ngajual sababaraha hal umumna liar. Nilai inlining di dieu nyaéta yén anjeun kaleungitan bagian tina overhead, overhead pikeun nelepon sareng nyimpen, anjeun tiasa ningali nilai di jero sareng tiasa langkung ngaoptimalkeunana. Biaya inlining nyaéta sajumlah ageung nilai hirup kabentuk, sareng upami alokasi pendaptaran anjeun kaduruk langkung ti anu diperyogikeun, anjeun langsung leungit. Ku alatan éta, paling allocators boga masalah: nalika inlining crosses hiji garis nu tangtu, sagalana di dunya mimiti ditegor jeung produktivitas bisa flushed handap jamban. Jalma anu nerapkeun kompiler nambahkeun sababaraha heuristics: contona, eureun inlining, dimimitian ku sababaraha ukuran cukup badag, sabab alokasi bakal ngaruksak sagalana. Ieu kumaha kink dina grafik kinerja kabentuk - anjeun inline, inline, kinerja lalaunan tumuwuh - lajeng booming! – eta ragrag ka handap kawas jack Swift sabab dijejeran teuing. Ieu kumaha sagalana digawé saméméh datangna Java. Java merlukeun leuwih loba inlining, jadi kuring kungsi nyieun allocator kuring leuwih agrésif meh tingkat kaluar tinimbang ngadat, sarta lamun inline teuing, dimimitian ngabahekeun, tapi lajeng "euweuh deui spilling" moment masih datang. Ieu observasi metot sarta eta ngan datang ka kuring kaluar tina nowhere, teu atra, tapi mayar kaluar ogé. Kuring nyandak up inlining agrésif jeung eta nyandak kuring ka tempat dimana kinerja Java jeung C gawé bareng. Aranjeunna caket pisan - kuring tiasa nyerat kode Java anu langkung gancang tibatan kode C sareng hal-hal sapertos kitu, tapi rata-rata, dina gambar ageung, aranjeunna kasarna dibandingkeun. Jigana bagian tina istighfar ieu allocator register, nu ngidinan kuring inline sakumaha stupidly sabisa. Kuring ngan inline sagalana kuring ningali. Patarosan di dieu nyaeta naha allocator nu gawéna ogé, naha hasilna mangrupa kode intelligently jalan. Ieu mangrupikeun tantangan anu ageung: ngartos sadayana ieu sareng ngajantenkeun jalanna.

A saeutik ngeunaan register alokasi sarta multi-cores

Владимир: Masalah kawas alokasi register sigana kawas sababaraha jenis langgeng, topik sajajalan. Kuring heran naha kantos aya ide anu sigana ngajangjikeun teras gagal dina prakna?

gawir: Tangtu! Ngadaptar alokasi mangrupakeun wewengkon nu Anjeun coba pikeun manggihan sababaraha heuristik pikeun ngajawab masalah NP-lengkep. Sareng anjeun moal pernah tiasa ngahontal solusi anu sampurna, leres? Ieu ngan saukur teu mungkin. Tingali, sateuacanna kompilasi Waktos - éta ogé henteu jalanna. Paguneman di dieu ngeunaan sababaraha kasus rata-rata. Ngeunaan kinerja has, jadi Anjeun bisa balik sarta ngukur hal nu Anjeun anggap kinerja has alus - barina ogé, anjeun digawé pikeun ngaronjatkeun eta! Alokasi ngadaptar mangrupikeun topik ngeunaan kinerja. Sakali anjeun boga prototipe munggaran, gawéna sarta cet naon diperlukeun, karya kinerja dimimitian. Anjeun kudu diajar ngukur ogé. Naha éta penting? Upami anjeun gaduh data anu jelas, anjeun tiasa ningali daérah anu béda-béda sareng ningali: nuhun, éta ngabantosan di dieu, tapi éta tempatna sadayana rusak! Sababaraha ideu anu saé muncul, anjeun nambihan heuristik énggal sareng ujug-ujug sadayana mimiti damel langkung saé rata-rata. Atawa teu ngamimitian. Kuring kungsi kebat kasus dimana urang pajoang pikeun kinerja lima persén nu differentiated ngembangkeun urang ti allocator saméméhna. Sarta unggal waktos eta Sigana mah kieu: wae anjeun meunang, wae anjeun leungit. Upami anjeun gaduh alat analisis kinerja anu saé, anjeun tiasa mendakan ideu anu kaleungitan sareng ngartos naha gagal. Panginten éta patut ngantepkeun sadayana sakumaha anu aya, atanapi panginten nyandak pendekatan anu langkung serius pikeun nyempurnakeun, atanapi kaluar sareng ngalereskeun anu sanés. Ieu kebat sakabeh hal! Kuring ngadamel hack anu saé ieu, tapi kuring ogé peryogi anu ieu, sareng anu ieu, sareng anu ieu - sareng kombinasi totalna masihan sababaraha perbaikan. Jeung loners bisa gagal. Ieu sifat karya kinerja dina masalah NP-lengkep.

Владимир: Hiji meunang rarasaan yén hal kawas lukisan di allocators mangrupakeun masalah anu geus direngsekeun. Nya, éta diputuskeun pikeun anjeun, ditilik ku naon anu anjeun carioskeun, janten naha éta patut ...

gawir: Henteu direngsekeun sapertos kitu. Anjeun kedah janten "direngsekeun". Aya masalah anu sesah sareng aranjeunna kedah direngsekeun. Sakali ieu rengse, éta waktu pikeun ngerjakeun produktivitas. Anjeun kedah ngadeukeutan karya ieu sasuai - ngalakukeun tolok ukur, ngumpulkeun métrik, ngajelaskeun kaayaan nalika, nalika anjeun ngagulung deui ka versi sateuacana, hack lami anjeun mimiti damel deui (atanapi sabalikna, lirén). Sarta ulah nyerah dugi ka ngahontal hiji hal. Sakumaha anu kuring parantos nyarios, upami aya ide-ide keren anu henteu jalan, tapi dina widang alokasi register ide éta kirang langkung sajajalan. Anjeun tiasa, contona, maca publikasi ilmiah. Sanajan ayeuna wewengkon ieu geus mimiti mindahkeun leuwih laun sarta geus jadi leuwih jelas ti di nonoman na. Nanging, aya seueur jalma anu damel di widang ieu sareng sadaya ideu kedah dicobian, aranjeunna sadayana ngantosan di jangjang. Sareng anjeun moal tiasa terang kumaha saéna upami anjeun nyobian aranjeunna. Kumaha ogé maranéhna ngahijikeun jeung sagalana sejenna dina allocator Anjeun, sabab hiji allocator ngalakukeun loba hal, sarta sababaraha gagasan dina allocator husus Anjeun moal jalan, tapi dina allocator sejen maranéhna bakal gampang. Cara utama pikeun meunang pikeun allocator nyaeta narik barang slow di luar jalur utama jeung maksa ka beulah sapanjang wates jalur slow. Janten upami anjeun hoyong ngajalankeun GC, angkat jalan anu laun, deoptimize, buang pengecualian, sadaya barang éta - anjeun terang hal-hal ieu jarang jarang. Jeung maranéhna bener langka, Kuring dipariksa. Anjeun ngalakukeun pagawéan tambahan sareng ngaleungitkeun seueur larangan dina jalur anu laun ieu, tapi éta henteu masalah sabab lambat sareng jarang ngarambat. Contona, hiji pointer null - eta pernah kajadian, katuhu? Anjeun kedah gaduh sababaraha jalur pikeun hal anu béda, tapi aranjeunna henteu kedah ngaganggu anu utama. 

Владимир: Kumaha saur anjeun ngeunaan multi-cores, lamun aya rébuan cores sakaligus? Ieu hiji hal mangpaat?

gawir: Kasuksésan GPU nunjukkeun yén éta téh rada mangpaat!

Владимир: Aranjeunna rada husus. Kumaha upami prosesor tujuan umum?

gawir: Tah, éta modél bisnis Azul. Jawabanna sumping deui dina jaman nalika jalma-jalma resep pisan kana pagelaran anu tiasa diprediksi. Hese nulis kode paralel harita. Modél coding H2O kacida scalable, tapi lain modél tujuan umum. Panginten sakedik langkung umum tibatan nalika nganggo GPU. Naha urang nyarioskeun pajeulitna ngembangkeun hal sapertos kitu atanapi pajeulitna ngagunakeunana? Salaku conto, Azul ngajarkeun kuring pelajaran anu pikaresepeun, anu teu jelas: cache leutik normal. 

Tantangan pangbadagna dina kahirupan

Владимир: Kumaha upami tantangan non-teknis?

gawir: Tangtangan pangbadagna éta teu jadi... bageur jeung hade ka jalma. Sareng akibatna, kuring teras-terasan mendakan diri dina kaayaan anu konflik pisan. Anu kuring terang yén aya anu salah, tapi henteu terang kumaha carana maju sareng masalah-masalah éta sareng henteu tiasa ngatasina. Seueur masalah jangka panjang, salami mangpuluh-puluh taun, timbul ku cara ieu. Kanyataan yén Java gaduh kompiler C1 sareng C2 mangrupikeun akibat langsung tina ieu. Kanyataan yén teu aya kompilasi multi-level di Jawa salami sapuluh taun berturut-turut ogé akibat langsung. Éta écés yén urang peryogi sistem sapertos kitu, tapi henteu écés naha éta henteu aya. Kuring ngagaduhan masalah sareng hiji insinyur ... atanapi sakelompok insinyur. Sakali waktu, nalika kuring mimiti digawé di Sun, abdi ... Oke, teu ngan lajeng, abdi umumna salawasna boga pamadegan sorangan dina sagalana. Sareng kuring panginten leres yén anjeun ngan ukur tiasa nyandak bebeneran anjeun sareng nyarioskeun éta. Utamana saprak kuring shockingly katuhu lolobana waktu. Tur upami Anjeun salah teu resep pendekatan ieu ... utamana lamun anjeun écés salah jeung ngalakukeun omong kosong ... Sacara umum, sababaraha urang bisa sabar formulir ieu komunikasi. Sanajan sababaraha bisa, kawas kuring. Kuring geus ngawangun sakabéh kahirupan kuring dina prinsip meritocratic. Mun anjeun némbongkeun kuring lepat, Kuring baris geura-giru balik sarta ngomong: ceuk omong kosong. Dina waktos anu sami, tangtosna, kuring nyuhunkeun hapunten sareng sadayana, kuring bakal perhatikeun jasa, upami aya, sareng ngalaksanakeun tindakan anu leres. Di sisi séjén, Abdi shockingly katuhu ngeunaan perséntase shockingly badag tina total waktu. Sareng éta henteu tiasa dianggo saé dina hubungan sareng jalma. Kuring teu nyoba jadi nice, tapi Kuring nanyakeun sual bluntly. "Ieu moal tiasa dianggo, sabab hiji, dua sareng tilu." Sareng aranjeunna sapertos, "Oh!" Aya konsékuansi séjén nu éta meureun hadé pikeun malire: misalna, maranéhanana anu ngarah ka cerai ti pamajikan kuring jeung sapuluh taun depresi sanggeus éta.

Tantangan mangrupikeun perjuangan sareng jalma, kalayan persépsi ngeunaan naon anu anjeun tiasa atanapi henteu tiasa laksanakeun, anu penting sareng anu henteu. Aya seueur tantangan ngeunaan gaya coding. Kuring masih nyerat seueur kode, sareng dina waktos éta kuring kedah ngalambatkeun sabab kuring ngalakukeun seueur tugas paralel sareng ngalakukeunana kirang, tibatan fokus kana hiji. Pilari deui, kuring nulis satengah kode pikeun paréntah Java JIT, paréntah C2. The coder panggancangna hareup wrote satengah sakumaha slow, hiji satengah salajengna sakumaha slow, tur éta turunna eksponensial. Jalma katujuh dina baris ieu pisan, lambat pisan - éta salawasna kajadian! Kuring keuna loba kode. Kuring nempo anu nulis naon, tanpa iwal, Kuring neuteup kana kode maranéhna, reviewed unggal sahijina, sarta masih terus nulis leuwih sorangan ti salah sahiji aranjeunna. Pendekatan ieu henteu dianggo saé pikeun jalma. Sababaraha urang teu resep ieu. Sareng nalika aranjeunna henteu tiasa nahan éta, sagala jinis keluhan dimimitian. Contona, kuring kungsi dititah eureun coding sabab kuring nulis teuing kode jeung ieu jeopardizing tim, sarta eta kabeh disada kawas lulucon pikeun kuring: dude, lamun sesa tim disappears jeung kuring tetep nulis kode, anjeun ngan bakal leungit satengah tim. Di sisi séjén, lamun kuring tetep nulis kode jeung anjeun leungit satengah tim, éta sora kawas manajemen pisan goréng. Kuring pernah bener mikir ngeunaan eta, pernah ngobrol ngeunaan eta, tapi masih wae dina sirah kuring. Pikiran ieu spinning dina tonggong pikiran kuring: "Naha anjeun sadayana bercanda kuring?" Janten, masalah pangbadagna nyaéta kuring sareng hubungan kuring sareng jalma. Ayeuna kuring ngartos diri kuring langkung saé, kuring parantos lami janten pimpinan tim pikeun programer, sareng ayeuna kuring langsung nyarios ka jalma: anjeun terang, kuring saha kuring, sareng anjeun kedah ngurus kuring - naha éta henteu kunanaon upami kuring nangtung Ieuh? Jeung nalika aranjeunna mimiti nungkulan eta, sagalana jalan. Nyatana, kuring henteu goréng atanapi saé, kuring henteu ngagaduhan niat goréng atanapi aspirasi egois, éta ngan hakekat kuring, sareng kuring kedah hirup sareng kumaha waé.

Андрей: Ngan nembe sadayana mimiti ngobrol ngeunaan kasadaran diri pikeun introverts, sarta soft skill sacara umum. Naon anu anjeun tiasa nyarios ngeunaan ieu?

gawir: Leres, éta wawasan sareng palajaran anu kuring pelajari tina talak kuring sareng pamajikan. Naon anu kuring diajar tina cerai éta ngartos sorangan. Ieu kumaha kuring mimiti ngarti jalma séjén. Ngartos kumaha interaksi ieu jalan. Ieu ngakibatkeun pamanggihan hiji sanggeus sejen. Aya kasadaran saha kuring sareng naon anu kuring ngagambarkeun. Naon anu kuring laksanakeun: boh kuring sibuk ku tugas, atanapi kuring ngahindarkeun konflik, atanapi anu sanés - sareng tingkat kasadaran diri ieu leres-leres ngabantosan kuring pikeun ngontrol. Sanggeus ieu sagalana mana loba gampang. Hiji hal anu kuring mendakan henteu ngan ukur dina diri kuring, tapi ogé dina programer sanés nyaéta henteu mampuh ngucapkeun pikiran nalika anjeun dina kaayaan setrés émosional. Salaku conto, anjeun nuju linggih di dinya coding, dina kaayaan aliran, teras aranjeunna sumping ka anjeun sareng mimiti ngajerit histeris yén aya anu rusak sareng ayeuna tindakan ekstrim bakal dilaksanakeun ngalawan anjeun. Sareng anjeun teu tiasa nyarios kecap sabab anjeun dina kaayaan setrés émosional. Pangaweruh anu kaala ngamungkinkeun anjeun pikeun nyiapkeun waktos ieu, salamet sareng teraskeun kana rencana mundur, saatos anjeun tiasa ngalakukeun hiji hal. Janten enya, nalika anjeun mimiti sadar kumaha éta sadayana jalan, éta mangrupikeun acara anu ngarobih kahirupan anu ageung. 
Kuring sorangan teu bisa manggihan kecap katuhu, tapi inget runtuyan lampah. Intina nyaéta réaksi ieu salaku seueur fisik sareng lisan, sareng anjeun peryogi rohangan. spasi misalna, dina rasa Zen. Ieu persis naon anu kudu dipedar, lajeng langsung miang - murni fisik ngajauhan. Nalika kuring cicingeun sacara lisan, kuring tiasa ngolah kaayaan sacara émosional. Nalika adrenalin ngahontal uteuk anjeun, ngalihkeun anjeun kana mode gelut atanapi hiber, anjeun moal tiasa nyarios nanaon deui, henteu - ayeuna anjeun bodo, insinyur pecut, henteu mampuh réspon anu santun atanapi bahkan ngeureunkeun serangan, sareng panyerang bébas. pikeun nyerang deui jeung deui. Anjeun mimitina kudu jadi diri deui, meunangkeun deui kontrol, kaluar tina mode "fight or flight".

Sareng pikeun ieu urang peryogi rohangan lisan. Ngan rohangan bébas. Upami anjeun nyarios nanaon, teras anjeun tiasa nyarios persis éta, teras angkat sareng leres-leres mendakan "spasi" pikeun diri anjeun: jalan-jalan di taman, konci diri dina pancuran - henteu masalah. Hal utama nyaéta pikeun samentawis megatkeun sambungan tina kaayaan éta. Pas anjeun pindah off salila sahenteuna sababaraha detik, kontrol mulih, Anjeun ngawitan pikir soberly. "Oke, kuring sanés jalma bodo, kuring henteu ngalakukeun hal-hal anu bodo, kuring jalma anu mangpaat." Sakali anjeun geus bisa ngayakinkeun diri, éta waktu pikeun ngaléngkah ka tahap salajengna: pamahaman naon anu lumangsung. Anjeun diserang, serangan datang ti mana anjeun teu nyangka, éta teu jujur, ambush vile. Ieu goréng. Léngkah salajengna nyaéta ngartos naha panyerang peryogi ieu. Leres, naha? Meureun alatan manéhna sorangan ngamuk? Naha anjeunna gélo? Salaku conto, sabab anjeunna ngaco dirina sareng teu tiasa nampi tanggung jawab? Ieu cara pikeun sacara saksama nanganan sadayana kaayaan. Tapi ieu merlukeun rohangan pikeun maneuver, spasi verbal. Hambalan munggaran nyaéta megatkeun kontak verbal. Hindarkeun diskusi ku kecap. Ngabolaykeun eta, leumpang kaluar gancang-gancang. Upami éta paguneman telepon, tutup waé - ieu mangrupikeun kaahlian anu kuring pelajari tina komunikasi sareng urut pamajikan. Lamun paguneman teu kamana alus, ngan nyebutkeun "wilujeng" jeung nutup telepon. Tina sisi séjén telepon: "bla bla bla", anjeun ngajawab: "ya, aduh!" jeung nutup telepon. Anjeun ngan mungkas paguneman. Lima menit engké, nalika kamampuhan pikeun mikir sensibly balik ka anjeun, anjeun geus leuwih tiis handap, janten mungkin pikeun mikir ngeunaan sagalana, naon anu lumangsung sarta naon anu bakal kajadian salajengna. Tur mimitian ngarumuskeun respon wijaksana, tinimbang ngan ngaréaksikeun kaluar tina émosi. Pikeun kuring, terobosan dina kasadaran diri mangrupikeun kanyataan yén bisi setrés émosional kuring henteu tiasa nyarios. Kaluar tina kaayaan ieu, mikir sareng ngarencanakeun kumaha ngabales sareng ngimbangan masalah - ieu mangrupikeun léngkah anu leres upami anjeun henteu tiasa nyarios. Cara panggampangna nyaéta kabur tina kaayaan dimana setrés émosional muncul sareng ngan saukur ngeureunkeun ilubiung dina setrés ieu. Sanggeus éta anjeun jadi bisa mikir, nalika anjeun bisa mikir, anjeun bisa nyarita, jeung saterusna.

Ku jalan kitu, di pangadilan, pengacara lawan nyoba ngalakukeun ieu ka anjeun - ayeuna jelas naha. Kusabab anjeunna gaduh kamampuan pikeun nahan anjeun ka kaayaan sapertos anjeun henteu tiasa ngucapkeun nami anjeun, contona. Dina rasa anu nyata, anjeun moal tiasa nyarios. Upami ieu kajantenan ka anjeun, sareng upami anjeun terang yén anjeun bakal mendakan diri anjeun dina tempat dimana perang verbal ngamuk, di tempat sapertos pangadilan, maka anjeun tiasa sumping sareng pengacara anjeun. Pangacara bakal nangtung pikeun anjeun sarta ngeureunkeun serangan verbal, sarta bakal ngalakukeun eta dina cara lengkep légal, sarta spasi Zen leungit bakal balik ka anjeun. Salaku conto, kuring kedah nyauran kulawarga kuring sababaraha kali, hakim éta rada ramah ngeunaan ieu, tapi pengacara lawan ngajerit sareng ngagorowok ka kuring, kuring henteu tiasa nampi kecap-kecap dina edgewise. Dina kasus ieu, ngagunakeun mediator a pangalusna pikeun kuring. Mediator eureun sagala tekanan ieu nu keur tuang on anjeun dina aliran kontinyu, anjeun manggihan spasi Zen perlu, tur kalawan eta kamampuhan pikeun nyarita mulih. Ieu mangrupikeun bidang pangaweruh anu seueur anu kedah diajar, seueur anu dipanggihan dina diri anjeun, sareng sadayana ieu janten kaputusan strategis tingkat luhur anu béda pikeun jalma anu béda. Sababaraha urang teu boga masalah ditétélakeun di luhur; biasana, jalma anu jualan profésional teu boga aranjeunna. Sadayana jalma-jalma ieu anu hirup ku kecap - panyanyi, pujangga, pamimpin agama sareng politikus, aranjeunna sok nyarios. Aranjeunna henteu ngagaduhan masalah sapertos kitu, tapi kuring.

Андрей: Tadi... teu kaduga. Hebat, urang parantos seueur ngobrol sareng waktosna pikeun ngeureunkeun wawancara ieu. Kami pasti bakal pendak dina konperénsi sareng bakal tiasa neraskeun dialog ieu. Sampai jumpa di Hydra!

Anjeun tiasa neraskeun paguneman anjeun sareng Cliff dina konperénsi Hydra 2019, anu bakal dilaksanakeun dina 11-12 Juli 2019 di St. Anjeunna bakal datang kalayan laporan "Pangalaman Mémori Transaksional Azul Hardware". Tiket bisa dibeuli dina situs wéb resmi.

sumber: www.habr.com

Tambahkeun komentar