Jadual Kandungan
Isi soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Mengapakah menukar 'antara muka{}' kembali kepada kepingan menghasilkan peruntukan timbunan tambahan?

Mengapakah menukar 'antara muka{}' kembali kepada kepingan menghasilkan peruntukan timbunan tambahan?

Feb 12, 2024 pm 10:15 PM
penukaran tersirat

Mengapakah menukar antara muka{} kembali kepada kepingan menghasilkan peruntukan timbunan tambahan?

Dalam PHP, apabila menukar jenis "antara muka{}" kepada jenis kepingan, ia akan menyebabkan peruntukan timbunan tambahan. Ini kerana dalam PHP, antara muka ialah jenis data abstrak, dan kepingan ialah jenis tatasusunan dinamik. Apabila kita menukar jenis antara muka kepada jenis kepingan, PHP perlu memperuntukkan ruang memori tambahan untuk jenis kepingan untuk menyimpan elemen kepingan. Operasi peruntukan timbunan tambahan ini akan menyebabkan overhed memori tambahan, yang mungkin menyebabkan isu prestasi untuk beberapa aplikasi sensitif memori. Oleh itu, apabila melakukan penukaran jenis, kita harus memberi perhatian kepada isu ini dan cuba mengelakkan peruntukan timbunan tambahan yang tidak perlu.

Isi soalan

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        return make([]byte, 1024)
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().([]byte)
        p.put(bts)
    }
}
Salin selepas log masuk

Tanda aras ini memberikan output berikut dalam go1.19.5.

benchmarkpool
benchmarkpool-10        47578498            24.47 ns/op       24 b/op          1 allocs/op
Salin selepas log masuk

Benda nampak berbeza bila guna *[]byte:

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        bts := make([]byte, 1024)
        return &bts
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().(*[]byte)
        p.put(bts)
    }
}
Salin selepas log masuk
BenchmarkPool
BenchmarkPool-10        142008002            8.581 ns/op           0 B/op          0 allocs/op
Salin selepas log masuk

Nampaknya menukar interface{} kembali kepada kepingan menghasilkan peruntukan timbunan tambahan.

Mengapa pergi memerlukan peruntukan tambahan ini? Apakah pertimbangan reka bentuk di sebalik ini?

Penyelesaian

Bukan any[]byte 的转换,而是 []byteany 的转换。 p.Put(bts) 将参数 bts 隐式转换为 any,然后再将其传递给 (*sync.Pool).Put yang menyebabkan peruntukan. Antara muka dalam GoGC 1.19 dilaksanakan sebagai sepasang penunjuk, satu menunjuk ke jenis metadata dan satu menunjuk ke objek sebenar, dalam kes ini penuding kedua terlepas ke kolam, menyebabkan objek hirisan diperuntukkan. Ini terpakai bukan sahaja untuk jenis hirisan, tetapi juga kepada mana-mana jenis bukan penuding lain.

Untuk penunjuk, seperti *[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除 *[]byte, pengkompil melakukan pengoptimuman dengan meletakkan nilainya terus ke dalam struktur iface, dengan itu mengalih keluar peruntukan contoh

apabila menukar kepada antara muka. Oleh itu, secara amnya disyorkan untuk meletakkan penunjuk ke dalam kolam dan bukannya struktur itu sendiri. 🎜

Atas ialah kandungan terperinci Mengapakah menukar 'antara muka{}' kembali kepada kepingan menghasilkan peruntukan timbunan tambahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menggunakan pendek dalam java Bagaimana untuk menggunakan pendek dalam java May 07, 2024 am 03:33 AM

short ialah jenis data primitif dalam Java yang mewakili integer bertanda 16-bit dalam julat -32,768 hingga 32,767. Ia sering digunakan untuk mewakili integer kecil, seperti pembilang atau ID, dan menyokong operasi aritmetik asas dan penukaran jenis. Tetapi kerana pendek ialah jenis yang ditandatangani, anda perlu berhati-hati apabila menggunakan pembahagian untuk mengelakkan limpahan atau aliran bawah.

Penggunaan ifnull dalam sql Penggunaan ifnull dalam sql Apr 28, 2024 am 09:57 AM

Fungsi IFNULL menyemak sama ada ungkapan adalah NULL dan mengembalikan nilai lalai yang ditentukan jika ya, jika tidak, ia mengembalikan nilai ungkapan. Ia menghalang nilai nol daripada menyebabkan ralat, membenarkan manipulasi nilai nol, dan meningkatkan kebolehbacaan pertanyaan. Penggunaan termasuk: menggantikan nilai nol dengan nilai lalai, tidak termasuk nilai nol daripada pengiraan, dan penggunaan bersarang untuk mengendalikan berbilang situasi nilai nol.

Apakah maksud char dalam java? Apakah maksud char dalam java? May 01, 2024 pm 06:15 PM

Jenis char dalam Java digunakan untuk menyimpan satu aksara Unicode, merangkumi 2 bait, antara U+0000 hingga U+FFFF Ia digunakan terutamanya untuk menyimpan aksara teks Ia boleh dimulakan melalui petikan tunggal atau urutan melarikan diri Unicode. dan boleh mengambil bahagian dalam perbandingan, Kesamaan, ketidaksamaan dan operasi bergabung boleh ditukar secara tersirat kepada jenis int atau ditukar secara eksplisit kepada objek Aksara.

Bagaimana untuk mengira pembahagian dalam bahasa c Bagaimana untuk mengira pembahagian dalam bahasa c Apr 13, 2024 pm 09:12 PM

Dalam bahasa C, tingkah laku operator bahagian / bergantung pada jenis data operan: Pembahagian integer: Apabila operan ialah integer, pembahagian integer dilakukan dan hasilnya dibundarkan ke bawah. Pembahagian titik terapung: Apabila operan ialah nombor titik terapung, pembahagian titik terapung dilakukan dan hasilnya ialah nombor titik terapung. Penukaran jenis: Apabila satu operan ialah integer dan satu lagi tidak, integer secara tersirat ditukar kepada nombor titik terapung, dan kemudian pembahagian titik terapung dilakukan. Pembahagi dengan 0: Ralat matematik berlaku apabila pembahagi ialah 0. Operasi modulo: Gunakan operator % untuk operasi modulo dan bukannya pembahagian modulo.

Penggunaan (+ dalam oracle Penggunaan (+ dalam oracle May 08, 2024 pm 08:12 PM

Operator tambah (+) dalam Oracle boleh digunakan untuk: menggabungkan rentetan, nombor, tarikh, dan selang masa mengendalikan nilai NULL dan menukar nilai NULL kepada bukan NULL;

Apakah maksud * dalam mysql Apakah maksud * dalam mysql Apr 26, 2024 am 07:21 AM

Asterisk (*) dalam MySQL bermaksud "semua" dan mempunyai kegunaan yang berbeza: Pilih semua lajur Pilih semua baris JOIN kad bebas untuk jadual LIKE klausa Pengkuantiti untuk klausa REGEXP Penukaran jenis tersirat

Apakah peraturan padanan untuk kelebihan beban fungsi C++? Apakah peraturan padanan untuk kelebihan beban fungsi C++? Apr 27, 2024 am 08:27 AM

Peraturan pemadanan lampau fungsi C++ adalah seperti berikut: padankan nombor dan jenis parameter dalam panggilan. Susunan parameter mestilah konsisten. Constness dan pengubah rujukan mesti sepadan. Parameter lalai boleh digunakan.

Mari terokai senario aplikasi biasa penukaran jenis tersirat! Mari terokai senario aplikasi biasa penukaran jenis tersirat! Jan 11, 2024 pm 04:45 PM

Mari terokai senario aplikasi biasa penukaran jenis tersirat! Pengenalan: Dalam bahasa pengaturcaraan, penukaran jenis tersirat ialah proses penukaran jenis data yang dilakukan secara automatik. Dalam sesetengah bahasa pengaturcaraan, penukaran ini dilakukan secara tersirat, tanpa perlu memberitahu secara eksplisit pengkompil atau penterjemah untuk melakukan penukaran. Penukaran jenis tersirat mempunyai pelbagai senario aplikasi dalam pengaturcaraan Artikel ini akan membincangkan beberapa senario aplikasi biasa. Penukaran jenis tersirat dalam pengiraan berangka Dalam pengiraan berangka, operasi antara jenis data yang berbeza selalunya diperlukan. Apabila jenis data yang berbeza

See all articles