Mengapakah penambahan konkurensi memperlahankan kod Go ini?
Kod yang disediakan mensimulasikan interaksi dengan raksasa dalam permainan dan kemungkinan item terjatuh apabila kalah. Walaupun jangkaan bahawa kod itu sepatutnya sesuai dengan sempurna untuk penyejajaran, penambahan konkurensi telah memperlahankannya dengan ketara.
Penjelasan:
Isunya terletak pada penggunaan rand.Float64( ), yang bergantung pada objek global yang dikongsi dengan kunci mutex. Apabila berbilang goroutine cuba menggunakan fungsi ini secara serentak, mereka menghadapi pertikaian untuk kunci, menghalang prestasi.
Penyelesaian:
Untuk menyelesaikan isu, buat contoh berasingan bagi struct Rand untuk setiap goroutine dan gunakan contoh itu untuk menjana nombor rawak. Pertentangan menghapuskan ini untuk kunci global dan membolehkan paralelisasi sebenar.
Kod Kemas Kini:
func interaction(generator *rand.Rand) int { if generator.Float64() <= DROP_RATE { return 1 } return 0 } func simulation(n int, generator *rand.Rand) []int { interactions := make([]int, n) for i := range interactions { interactions[i] = interaction(generator) } return interactions }
Peningkatan Prestasi:
Selepas menggunakan pembetulan untuk mencipta tika Rand baharu untuk setiap goroutine, kod yang terhasil menunjukkan peningkatan yang ketara dalam prestasi. Masa yang diambil untuk menjalankan simulasi dikurangkan sekitar 75% apabila menggunakan dua pemproses.
Kesimpulan:
Apabila menggunakan concurrency dalam Go, elakkan bergantung pada perkongsian global Contoh Rand. Sebaliknya, buat contoh berasingan bagi struktur Rand untuk setiap goroutine untuk memastikan prestasi optimum.
Atas ialah kandungan terperinci Mengapa Concurrency Memperlahankan Kod My Go Menggunakan `rand.Float64()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!