Concurrency Memperlahankan Kod Golang
Dalam usaha untuk mengoptimumkan simulasi kod interaksi dengan raksasa dan kejatuhan item, concurrency telah diperkenalkan, secara mengejutkan menjejaskan prestasi negatif.
Kod asal, tanpa konkurensi, mempunyai tiga fungsi utama: interaksi, simulasi dan ujian. interaksi mensimulasikan satu interaksi dan mengembalikan 1 untuk kejatuhan item atau 0 sebaliknya. simulasi melaksanakan berbilang interaksi dan menyimpan hasilnya dalam kepingan. ujian menjalankan satu siri simulasi dan menyimpan jumlah bilangan interaksi yang berjaya dalam sekeping.
Apabila konkurensi ditambah, goroutin dicipta untuk setiap ujian, dengan setiap goroutine berjalan dengan salinan simulasinya sendiri. Walau bagaimanapun, prestasi bertambah buruk dan bukannya bertambah baik.
Sebab Kelembapan
Isu terletak pada fungsi rand.Float64(), yang menggunakan objek global dikongsi dengan Mutex kunci. Secara lalai, setiap goroutine akan memperoleh kunci Mutex ini apabila memanggil rand.Float64(), akhirnya memperlahankan prestasi.
Penyelesaian
Untuk membetulkannya, rand yang berasingan. Contoh baru () telah dibuat untuk setiap CPU. Ini telah menghapuskan masalah kunci Mutex yang dikongsi dan meningkatkan prestasi dengan ketara.
Penambahbaikan Tambahan
Peningkatan prestasi selanjutnya dicapai dengan menggantikan fungsi kemudahan rand.Float64() dengan langsung memanggil struct Rand. Fungsi kemudahan menggunakan contoh Rand yang dilindungi mutex global, manakala panggilan terus mengelakkan overhed ini.
Kesimpulan
Walaupun konkurensi boleh meningkatkan prestasi untuk masalah tertentu, pelaksanaan yang betul adalah penting. Dalam kes ini, menggunakan rand.New() yang berasingan dan mengelakkan kunci Mutex dikongsi adalah kunci untuk meminimumkan kemerosotan prestasi.
Atas ialah kandungan terperinci Mengapa Menambah Concurrency Memperlahankan Kod My Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!