Mengukur Gas
Alat pemprofilan
Mengukur Gas ialah pelajaran Asas Pembangunan Web3 & DApp percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Asas Pembangunan Web3 & DApp, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.
Ukur, Jangan Agak
Pengoptimuman gas tanpa pengukuran hanyalah tekaan. Pengkompil, kos opcode dan corak akses saling berinteraksi dengan cara yang tidak jelas, jadi perubahan yang kelihatan munasabah kadangkala boleh memburukkan keadaan.
Sentiasa lakukan pemprofilan sebelum dan selepas perubahan. Perubahan yang tidak mengurangkan gas yang diukur bukanlah pengoptimuman, tidak kira betapa bijaknya perubahan itu kelihatan.
Laporan Gas Forge
forge test --gas-report daripada Foundry mencetak jadual penggunaan gas minimum, purata, median dan maksimum bagi setiap fungsi merentasi semua ujian anda. Ini ialah cara terpantas untuk mengenal pasti fungsi yang mahal.
$ forge test --gas-report
| Function | min | avg | median | max | # calls |
| transfer | 28012 | 34521 | 34521 | 51012 | 12 |
| approve | 24300 | 24300 | 24300 | 24300 | 5 |Syot Kilat Gas
forge snapshot menulis kos gas setiap ujian ke dalam fail .gas-snapshot. Masukkannya ke dalam kawalan versi, kemudian jalankan forge snapshot --diff untuk melihat dengan tepat kesan sesuatu perubahan terhadap gas.
Ini menukarkan regresi gas kepada perbezaan yang boleh disemak dalam permintaan tarik.
$ forge snapshot
$ forge snapshot --diff
testTransfer() (gas: -1240 (-3.6%))
testMint() (gas: +85 (+0.2%))Mengukur dalam Ujian
Untuk pengukuran terperinci, baca gasleft() sebelum dan selepas panggilan dalam ujian. Perbezaannya ialah gas yang digunakan oleh blok kod tersebut.
uint256 before = gasleft();
target.doWork();
uint256 used = before - gasleft();
emit log_named_uint("gas used", used);Jejak Terperinci
Menjalankan ujian dengan -vvvv memaparkan jejak pelaksanaan penuh, termasuk kos gas bagi setiap panggilan luaran dan kumpulan opcode. Ini menunjukkan di mana gas digunakan, bukan sekadar jumlah keseluruhan.
$ forge test --match-test testTransfer -vvvv
[34521] Token::transfer(bob, 100)
emit Transfer(from: alice, to: bob, value: 100)
return: trueTetapan Pengoptimum
Pengoptimum Solidity mengubah gas masa jalan dan gas pelaksanaan. Parameter runs ialah petunjuk tentang kekerapan fungsi dipanggil.
runsrendah (contohnya 1) mengoptimumkan pelaksanaan yang murahrunstinggi (contohnya 10000) mengoptimumkan panggilan berulang yang murah
Tetapkannya dalam foundry.toml dan sentiasa lakukan pengukuran dengan pengoptimum diaktifkan kerana keadaan ini mencerminkan tingkah laku produksi.
# foundry.toml
[profile.default]
optimizer = true
optimizer_runs = 10000Membandingkan Pelaksanaan
Untuk membandingkan dua pendekatan, tulis ujian yang menjalankan setiap pendekatan dalam keadaan yang sama dan periksa laporan gas secara bersebelahan.
Kekalkan input yang sama dan asingkan perubahan kepada satu pemboleh ubah; jika tidak, anda tidak dapat mengaitkan perbezaan gas dengan pengoptimuman yang dibuat.
function testNaive() public { c.sumNaive(data); }
function testOptimized() public { c.sumOptimized(data); }
// compare both rows in --gas-reportBerwaspada terhadap Perbezaan Panas dan Sejuk
Laporan gas boleh mengelirukan kerana akses pertama dalam ujian adalah sejuk dan akses seterusnya adalah panas. Fungsi yang dipanggil sekali dalam persediaan mungkin menunjukkan kos sejuk yang lebih tinggi daripada fungsi yang sama apabila dipanggil kemudian.
Perhatikan lajur minimum, median dan maksimum secara bersama, bukannya satu purata sahaja, dan reka bentuk ujian yang mencerminkan corak akses dunia sebenar.
Etherscan dan Resit Sebenar
Resit transaksi dalam rantaian melaporkan gasUsed sebenar. Etherscan dan peneroka blok memaparkan nilai ini bagi setiap transaksi, membolehkan anda mengesahkan pengukuran tempatan berbanding keadaan sebenar rangkaian utama.
Kaedah RPC eth_estimateGas memberikan anggaran sebelum pelaksanaan, tetapi ia menambah margin keselamatan dan mungkin berbeza daripada kos pelaksanaan sebenar.
Gerbang Regresi Gas dalam CI
Masukkan forge snapshot --check ke dalam integrasi berterusan. Arahan ini akan menggagalkan binaan jika gas mana-mana ujian melebihi syot kilat yang disimpan melebihi toleransi.
Ini menghalang regresi gas yang tidak disengajakan daripada masuk ke produksi dan menjadikan gas metrik kualiti utama.
$ forge snapshot --check
# exits non-zero if gas increased vs committed snapshotAliran Kerja Pengukuran
Aliran kerja gas yang kukuh:
- Tulis ujian yang meliputi laluan kritikal
- Rekodkan garis dasar dengan
forge snapshot - Lakukan satu pengoptimuman pada satu-satu masa
- Jalankan
forge snapshot --diffuntuk mengesahkan peningkatan - Hadkan regresi dalam CI dengan
--check
Disiplin mengatasi kebijaksanaan yang berlebihan.
Semakan Pantas
Perintah Foundry yang manakah menghasilkan jadual penggunaan gas minimum, purata dan maksimum bagi setiap fungsi?
Ringkasan
Anda telah mempelajari cara mengukur gas:
forge test --gas-reportuntuk jadual bagi setiap fungsiforge snapshot --diffuntuk menjejaki perubahangasleft()untuk pengukuran terperinci- Jejak terperinci menunjukkan ke mana gas digunakan
- Hadkan regresi dalam CI dengan
--check
Ini melengkapkan kursus Pengoptimuman Gas. Seterusnya: kit alat Foundry secara mendalam.
Pelajari Asas Pembangunan Web3 & DApp dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 29
- Pelajaran
- 105
Soalan Lazim
Adakah pelajaran “Mengukur Gas” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Asas Pembangunan Web3 & DApp, termasuk “Mengukur Gas”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengukur Gas”?
Alat pemprofilan Anda berlatih Asas Pembangunan Web3 & DApp menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Asas Pembangunan Web3 & DApp?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Asas Pembangunan Web3 & DApp di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Mengukur Gas” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Asas Pembangunan Web3 & DApp ini?
Ya. Setiap pelajaran Asas Pembangunan Web3 & DApp menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.