Asas Pembangunan Web3 & DApp · Pelajaran

Mengukur Gas

Alat pemprofilan

Pelajaran 4 daripada 413 langkah

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: true

Tetapan Pengoptimum

Pengoptimum Solidity mengubah gas masa jalan dan gas pelaksanaan. Parameter runs ialah petunjuk tentang kekerapan fungsi dipanggil.

  • runs rendah (contohnya 1) mengoptimumkan pelaksanaan yang murah
  • runs tinggi (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 = 10000

Membandingkan 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-report

Berwaspada 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 snapshot

Aliran 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 --diff untuk 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-report untuk jadual bagi setiap fungsi
  • forge snapshot --diff untuk menjejaki perubahan
  • gasleft() 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.

Percuma untuk bermula

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.

Semua pelajaran dalam kursus ini

  1. Model Kos Gas
  2. Pengoptimuman Storan
  3. Helah Gelung dan Calldata
  4. Mengukur Gas
← Kembali ke Asas Pembangunan Web3 & DApp