Mengonversi bilangan bulat ke antarmuka {} di Go 1.15

Dalam rilis 1.15 laptop Go, saya menemukan entri berikut :

Konversi nilai integer kecil ke antarmuka sekarang terjadi tanpa alokasi.
Dalam posting singkat ini saya akan memberitahu Anda apa itu optimasi.



Bagaimana antarmuka {} bekerja di Go



Untuk memahami bagaimana pengoptimalan ini bekerja, Anda perlu memoles kembali perangkat {} antarmuka di Go. Saya tidak akan terlalu mendalami topik ini, cukup ingat ide-ide utamanya.



Di dalam src / runtime / runtime2.go ada struktur seperti ini:



type iface struct {
	tab  *itab
	data unsafe.Pointer
}


Ini adalah antarmuka kami. Nyatanya, antarmuka {} hanya 2 petunjuk:



  • data - penunjuk ke data itu sendiri, di mana memori dialokasikan di heap
  • tab - informasi meta tentang antarmuka dan tipe dasar


Kami memvisualisasikan pengetahuan yang diperoleh dan melanjutkan.







Apa masalah sebenarnya 



Di Go, mengalokasikan objek baru di hip mahal. Oleh karena itu, jika Anda ingin menulis kode produktif, Anda pasti akan menghadapi masalah ini. Jadi, setiap, bahkan pada pandangan pertama, pengoptimalan kecil dapat meningkatkan kinerja seluruh aplikasi.



Masalah yang dipecahkan oleh pengoptimalan yang dipertimbangkan adalah bahwa mengalokasikan objek untuk bilangan bulat kecil adalah upaya yang sia-sia.



Bagaimana itu diselesaikan



Inilah yang dilakukan orang-orang di Go. Dalam paket waktu proses, mereka sudah memiliki larik statis bilangan bulat dari 0 hingga 255. Pada saat ketika bilangan bulat dikonversi ke antarmuka {}, pemeriksaan dilakukan apakah nomor ini dalam kisaran yang ditentukan, dan jika demikian, penunjuk ke elemen dalam larik ini. Ini menghilangkan alokasi yang tidak perlu.



Anda bisa melihat perubahannya di gihab .



Jenis pengoptimalan ini bukanlah hal baru di Go. Jadi, jika Anda membuat string ascii satu karakter, tidak akan ada alokasi memori. Tidak akan ada semuanya sesuai dengan skenario yang sama: runtime Go berisi larik statis dari string karakter tunggal. Ngomong-ngomong, jangan khawatir, karena saat ini hanya ada satu larik statis berisi nilai dari 0 hingga 255 yang hidup dalam waktu proses. Ini digunakan kembali untuk representasi string.



All Articles