Pergi: Nota pengoptimuman mudah
Apabila VPS anda menjalankan berbilang aplikasi perkhidmatan, tetapi salah satu daripadanya kadangkala mengambil semua sumber, menjadikannya mustahil untuk mengakses pelayan melalui ssh. Anda beralih kepada menggunakan kluster Kubernetes dan tetapkan had untuk semua aplikasi. Kami kemudian melihat beberapa aplikasi dimulakan semula apabila pembunuh OOM membetulkan isu "kebocoran" memori.
Sudah tentu, OOM tidak selalu menjadi masalah kebocoran, ia juga boleh menjadi sumber berlebihan. Masalah kebocoran kemungkinan besar disebabkan oleh ralat program Topik yang kita bicarakan hari ini ialah bagaimana untuk mengelakkan situasi ini.
Penggunaan sumber yang berlebihan merugikan dompet, ini bermakna kita perlu mengambil tindakan segera.
Jangan mengoptimumkan lebih awal
Sekarang mari kita bercakap tentang pengoptimuman. Mudah-mudahan anda boleh memahami mengapa kami tidak perlu mengoptimumkan lebih awal!
Pertama, pengoptimuman mungkin kerja yang sia-sia. Kerana kita harus mengkaji keseluruhan aplikasi terlebih dahulu, dan kemungkinan besar kod anda tidak akan menjadi hambatan. Apa yang kami perlukan ialah keputusan pantas, MVP (Minimum Viable Product, minimum viable product), dan kemudian kami akan mempertimbangkan masalahnya. Kedua, pengoptimuman mesti ada asas. Maksudnya, setiap pengoptimuman harus berdasarkan penanda aras, dan kita mesti membuktikan berapa banyak keuntungan yang dibawanya kepada kita. Ketiga, pengoptimuman mungkin membawa kerumitan. Apa yang anda perlu tahu ialah kebanyakan pengoptimuman menjadikan kod anda kurang boleh dibaca. Anda perlu mencapai keseimbangan ini.
Cadangan pengoptimuman
Kini kami memberikan beberapa cadangan praktikal mengikut klasifikasi entiti standard dalam Go.
1. Tatasusunan dan kepingan
Peruntukkan memori untuk kepingan terlebih dahulu
Cuba gunakan parameter ketiga: <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #000000;background: rgba(14, 210, 247, 0.15);"><span style="font-size: 15px;">make([]T, 0, len)</span>
make([]T, 0, len)
Jika bilangan elemen yang tepat tidak diketahui dan hirisan adalah jangka pendek Ya, anda boleh memperuntukkan saiz yang lebih besar untuk memastikan bahawa hirisan tidak berkembang semasa masa jalan.
Jangan lupa gunakan salinanCuba jangan gunakan append semasa menyalin, seperti apabila menggabungkan dua atau lebih kepingan.
Lelaran yang betulSekeping yang mengandungi banyak elemen atau elemen besar, gunakan untuk mendapatkan satu elemen. Dengan cara ini pertindihan yang tidak perlu akan dielakkan.
Multiplexing SlicesJika beberapa operasi dilakukan pada kepingan masuk dan mengembalikan hasil yang diubah suai, kami boleh mengembalikannya. Ini mengelakkan peruntukan memori baharu.
🎜Jangan tinggalkan bahagian hirisan yang tidak digunakan
Jika anda perlu memotong sekeping kecil dari hirisan dan menggunakannya sahaja, bahagian utama hirisan juga akan disimpan. Pendekatan yang betul ialah menggunakan salinan baharu kepingan kecil ini dan buang kepingan lama ke GC.
2. Penyambungan rentetan yang betul
Jika rentetan penyambungan boleh dilakukan dalam satu pernyataan, maka gunakan <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #000000;background: rgba(14, 210, 247, 0.15);"><span style="font-size: 15px;">+</span>
操作符。如果需要在循环中执行此操作,使用 <span style="font-size: 15px;">string.Builder</span>
,并使用它的 <span style="font-size: 15px;">Grow</span>
方法预先指定 <span style="font-size: 15px;">Builder</span>
的大小,减少内存分配次数。
转换优化
string 和 []byte 在底层结构上非常相近,有时这两种类型之间可以通过强转换来避免内存分配。
字符串驻留
可以池化字符串,从而帮助编译器只存储一次相同的字符串。
避免分配
我们可以使用 map(级联)而不是复合键,我们可以使用字节切片。尽量不使用 <span style="font-size: 15px;">fmt</span>
+ operator. Jika anda perlu melakukan ini dalam satu gelung, gunakan
🎜string.Builder🎜
🎜 dan gunakan 🎜🎜Grow🎜
🎜 kaedah adalah pra-ditetapkan🎜🎜Builder🎜
🎜 saiz, mengurangkan bilangan peruntukan memori. 🎜🎜🎜Pengoptimuman penukaran🎜🎜🎜rentetan dan []bait sangat serupa dalam struktur asas, dan kadangkala penukaran yang kuat boleh digunakan antara kedua-dua jenis ini untuk mengelakkan peruntukan memori. 🎜🎜🎜String resident🎜🎜🎜 boleh mengumpulkan rentetan, sekali gus membantu pengkompil menyimpan rentetan yang sama sekali sahaja. 🎜🎜🎜Elak peruntukan🎜🎜🎜Kita boleh menggunakan map(cascade) dan bukannya kekunci komposit, kita boleh menggunakan kepingan bait. Cuba jangan gunakan 🎜🎜 fmt 🎜
🎜 pakej, kerana semua kaedahnya menggunakan refleksi. 🎜🎜3. Struktur
Elakkan menyalin struktur besar
Kami faham bahawa struktur kecil tidak lebih daripada 4 medan dan tidak lebih daripada satu saiz perkataan mesin.
Beberapa senario salinan biasa
Diunjurkan ke antara muka Saluran menerima dan menghantar elemen -
Tambahkan elemen pada kepingan Lelaran (julat)
Pembatalan rujukan adalah mahal dan kita harus melakukannya sesedikit mungkin, terutamanya dalam gelung. Ia juga kehilangan keupayaan untuk menggunakan daftar pantas.
Mengendalikan struktur kecilKerja ini dioptimumkan oleh editor, yang bermaksud ia murah.
Gunakan penjajaran untuk mengurangkan saiz strukturKita boleh mengurangkan saiz struktur itu sendiri dengan menjajarkan struktur (susun mengikut susunan yang betul mengikut saiz medan). . Ini benar terutamanya untuk laluan panas.
Yang mana tidak akan sebaris
pemulihan
pilih blok
pengisytiharan jenis
-
goroutine untuk-julat-
munasabah Pilih parameter fungsi dengan bijak
Cuba gunakan parameter kecil kerana replikasinya akan dioptimumkan. Cuba pastikan replikasi dan pertumbuhan tindanan seimbang pada beban GC. Elakkan sejumlah besar parameter dan biarkan program anda menggunakan daftar pantas (bilangannya terhad).
Namakan nilai pulangan
Ini nampaknya lebih cekap daripada mengisytiharkan pembolehubah ini dalam badan fungsi.
Simpan hasil perantaraan
Bantu pengkompil mengoptimumkan kod anda, simpan hasil perantaraan, dan kemudian akan terdapat lebih banyak pilihan untuk mengoptimumkan kod anda.
Gunakan tangguh dengan berhati-hati
Cuba jangan gunakan penangguhan, atau sekurang-kurangnya jangan gunakannya dalam gelung.
Bantu laluan panas
Elakkan memperuntukkan ingatan dalam laluan panas, terutamanya objek jangka pendek. Buat cawangan yang paling biasa (jika, suis)
5 Peta
Peruntukkan memori terlebih dahuluSama seperti slice, apabila memulakan peta, nyatakan saiznya. .
Kosongkan peta
peta hanya boleh membesar, tidak mengecut. Apabila kita perlu menetapkan semula peta, memadamkan semua elemennya tidak akan membantu.
Cuba jangan gunakan penunjuk dalam kekunci dan nilai
Jika peta tidak mengandungi penunjuk, maka GC tidak akan membuang masa yang berharga di atasnya. Rentetan juga menggunakan penunjuk, jadi anda harus menggunakan tatasusunan bait dan bukannya rentetan sebagai kunci.
Kurangkan bilangan pengubahsuaian
Sekali lagi, kami tidak mahu menggunakan penunjuk, tetapi kami boleh menggunakan gabungan peta dan kepingan, menyimpan kekunci dalam peta dan nilai dalam kepingan. Dengan cara ini kita boleh menukar nilai tanpa sekatan. . Kuncinya ialah menyalin. Ternyata kos tinju dan membuka kotak antara muka akan lebih kurang sama dengan peruntukan saiz struktur.
Memilih jenis yang optimum
Dalam sesetengah kes, tiada peruntukan semasa bertinju dan menyahkotak antara muka. Contohnya, nilai kecil atau boolean untuk pembolehubah dan pemalar, struktur dengan satu medan mudah, penunjuk (termasuk peta, saluran, fungsi)Elakkan peruntukan memori
Seperti di tempat lain, cuba elakkan peruntukan yang tidak perlu. Contohnya memberikan satu antara muka kepada yang lain dan bukannya bertinju dua kali.Gunakan hanya apabila diperlukan
Elakkan menggunakan antara muka dalam parameter fungsi yang sering dipanggil dan kembalikan hasil. Kami tidak memerlukan operasi pembongkaran tambahan. Kurangkan kekerapan menggunakan panggilan kaedah antara muka kerana ia menghalang sebaris.7. Penunjuk, Saluran, Semakan Had
Elakkan penyimpangan yang tidak perlu
Terutamanya dalam gelung kerana ia ternyata terlalu mahal. Penyahrujukan adalah sesuatu yang kami tidak mahu lakukan dengan perbelanjaan kami sendiri.
Menggunakan saluran adalah tidak cekap
Penyegerakan saluran adalah lebih perlahan daripada kaedah primitif penyegerakan yang lain. Di samping itu, lebih banyak kes dalam pilihan, lebih perlahan program kami. Walau bagaimanapun, pilih, huruf besar tambah lalai telah dioptimumkan.
Elakkan pemeriksaan sempadan yang tidak perlu
Ini juga mahal dan kita harus mengelakkannya. Sebagai contoh, semak (dapatkan) indeks hirisan maksimum sekali sahaja, bukan beberapa kali. Sebaiknya cuba dapatkan pilihan yang melampau sekarang.
Ringkasan
Sepanjang artikel ini, kami melihat beberapa peraturan pengoptimuman yang sama.
Bantu penyusun membuat keputusan yang betul dan ia akan berterima kasih kepada anda. Peruntukkan memori pada masa penyusunan, gunakan hasil perantaraan dan cuba pastikan kod anda boleh dibaca.
Saya mengulangi bahawa untuk pengoptimuman tersirat, penanda aras adalah wajib. Jika sesuatu yang berfungsi semalam tidak akan berfungsi esok kerana pengkompil berubah terlalu cepat antara versi, dan sebaliknya.
Jangan lupa untuk menggunakan alat analisis dan penjejakan terbina dalam Go.
Atas ialah kandungan terperinci Pergi: Nota pengoptimuman mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dalam Go, kitaran hayat fungsi termasuk definisi, pemuatan, pemautan, pemulaan, panggilan dan skop pembolehubah dibahagikan kepada tahap fungsi dan tahap blok Pembolehubah dalam fungsi boleh dilihat secara dalaman, manakala pembolehubah dalam blok hanya kelihatan dalam blok .

Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Bahasa Go dan Go adalah entiti yang berbeza dengan ciri yang berbeza. Go (juga dikenali sebagai Golang) terkenal dengan kesesuaiannya, kelajuan penyusunan pantas, pengurusan memori dan kelebihan merentas platform. Kelemahan bahasa Go termasuk ekosistem yang kurang kaya berbanding bahasa lain, sintaks yang lebih ketat dan kekurangan penaipan dinamik.

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Lihat dokumentasi fungsi Go menggunakan IDE: Tuding kursor pada nama fungsi. Tekan kekunci pintas (GoLand: Ctrl+Q; VSCode: Selepas memasang GoExtensionPack, F1 dan pilih "Go:ShowDocumentation").

Unit menguji fungsi serentak adalah penting kerana ini membantu memastikan kelakuan mereka yang betul dalam persekitaran serentak. Prinsip asas seperti pengecualian bersama, penyegerakan dan pengasingan mesti dipertimbangkan semasa menguji fungsi serentak. Fungsi serentak boleh diuji unit dengan mensimulasikan, menguji keadaan perlumbaan dan mengesahkan keputusan.

Dalam Golang, pembalut ralat membolehkan anda membuat ralat baharu dengan menambahkan maklumat kontekstual kepada ralat asal. Ini boleh digunakan untuk menyatukan jenis ralat yang dilemparkan oleh perpustakaan atau komponen yang berbeza, memudahkan penyahpepijatan dan pengendalian ralat. Langkah-langkahnya adalah seperti berikut: Gunakan fungsi ralat. Balut untuk membalut ralat asal kepada ralat baharu. Ralat baharu mengandungi maklumat kontekstual daripada ralat asal. Gunakan fmt.Printf untuk mengeluarkan ralat yang dibalut, memberikan lebih konteks dan kebolehtindakan. Apabila mengendalikan pelbagai jenis ralat, gunakan fungsi ralat. Balut untuk menyatukan jenis ralat.
