Rumah >pembangunan bahagian belakang >Golang >Mengurangkan tekanan pengumpul sampah di Golang
Dalam aplikasi Go berprestasi tinggi, peruntukan memori yang berlebihan dan deallocation boleh menjejaskan prestasi dengan serius, memberikan tekanan yang tidak perlu pada pengumpul sampah (GC), mengakibatkan peningkatan kependaman dan kecekapan berkurangan. Artikel ini akan memperkenalkan cara menggunakan teknologi guna semula objek dan ciri sync.Pool
untuk mengurangkan tekanan GC.
Artikel ini diilhamkan oleh siaran LinkedIn oleh Branko Pitulic, yang menyerlahkan kepentingan mengoptimumkan penggunaan memori dalam aplikasi Go.
Pengumpul sampah Go bertanggungjawab untuk pengurusan memori automatik. Walau bagaimanapun, apabila aplikasi memperuntukkan dan membebaskan memori dengan kerap (terutamanya pada timbunan), GC perlu bekerja lebih keras, menghasilkan:
Matlamatnya adalah untuk mengurangkan bilangan objek yang diperuntukkan pada timbunan dengan menggalakkan penggunaan semula memori.
Gunakan semula objek apabila boleh dan bukannya mencipta objek baharu. Corak biasa ialah menggunakan semula kepingan dan tatasusunan.
<code class="language-go">func process() []byte { return make([]byte, 1024) // 每次都创建一个新的切片。 }</code>
<code class="language-go">var buffer = make([]byte, 1024) func process() []byte { return buffer // 重用现有的切片。 }</code>
Nota: Pendekatan ini berfungsi dengan baik dalam konteks bukan serentak di mana penggunaan semula adalah selamat.
sync.Pool
sync
menyediakan jenis Pool
, iaitu struktur kumpulan objek yang cekap yang membolehkan penggunaan semula, dengan itu mengurangkan peruntukan memori pada timbunan.
sync.Pool
berfungsi: <code class="language-go">package main import ( "fmt" "sync" ) func main() { // 创建一个对象池。 pool := sync.Pool{ New: func() any { return make([]byte, 1024) // 创建一个新的1KB切片。 }, } // 从池中检索一个对象。 buffer := pool.Get().([]byte) fmt.Printf("Buffer length: %d\n", len(buffer)) // 通过将对象放回池中来重用它。 pool.Put(buffer) // 从池中检索另一个对象。 reusedBuffer := pool.Get().([]byte) fmt.Printf("Reused buffer length: %d\n", len(reusedBuffer)) }</code>
Dalam contoh ini:
New
untuk memulakan objek. sync.Pool
Get
Gunakan untuk mengembalikan objek ke kolam untuk bekalan. Put
sync.Pool
Objek ringan: kolam sangat sesuai untuk objek kecil atau sederhana. Untuk objek besar, kos penyimpanan mungkin melebihi pendapatan. sync.Pool
Elakkan penggunaan kolam yang berlebihan: New
<.> 4. Kes -kes biasa
boleh membantu.
<code class="language-go">func process() []byte { return make([]byte, 1024) // 每次都创建一个新的切片。 }</code>
sync.Pool
<code class="language-go">var buffer = make([]byte, 1024) func process() []byte { return buffer // 重用现有的切片。 }</code>
Atas ialah kandungan terperinci Mengurangkan tekanan pengumpul sampah di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!