Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi: Nota pengoptimuman mudah

Pergi: Nota pengoptimuman mudah

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-21 13:04:42939semak imbas
Dalam era pengkomputeran awan, kami sering mencipta aplikasi tanpa pelayan (model pembangunan asli awan yang membolehkan pembangun membina dan menjalankan aplikasi tanpa mengurus pelayan). Apabila projek kami menggunakan model ini, belanjawan penyelenggaraan infrastruktur akan berada di bahagian atas senarai. Jika beban pada perkhidmatan kami rendah, ia hampir percuma. Tetapi jika berlaku masalah, anda akan membayar banyak untuknya! Apabila ia datang kepada wang, anda pasti akan bertindak balas terhadapnya dalam beberapa cara.

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 salinan

Cuba jangan gunakan append semasa menyalin, seperti apabila menggabungkan dua atau lebih kepingan.

Lelaran yang betul

Sekeping yang mengandungi banyak elemen atau elemen besar, gunakan untuk mendapatkan satu elemen. Dengan cara ini pertindihan yang tidak perlu akan dielakkan.

Multiplexing Slices

Jika 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)
Elakkan mengakses medan struct melalui penunjuk

Pembatalan rujukan adalah mahal dan kita harus melakukannya sesedikit mungkin, terutamanya dalam gelung. Ia juga kehilangan keupayaan untuk menggunakan daftar pantas.

Mengendalikan struktur kecil

Kerja ini dioptimumkan oleh editor, yang bermaksud ia murah.

Gunakan penjajaran untuk mengurangkan saiz struktur

Kita 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 dahulu

Sama 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!

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam