0Pricing
Web3 & DApp Development Fundamentals · درس

قياس Gas

أدوات تحليل الأداء

قياس Gas درس مجاني في Web3 & DApp Development Fundamentals على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Web3 & DApp Development Fundamentals، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Web3 & DApp Development Fundamentals 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

Measure, Don't Guess

Gas optimization without measurement is guesswork. The compiler, opcode costs, and access patterns interact in non-obvious ways, so an intuitive change can sometimes make things worse.

Always profile before and after. A change that does not reduce measured gas is not an optimization, no matter how clever it looks.

Forge Gas Reports

Foundry's forge test --gas-report prints a per-function table of min, average, median, and max gas usage across all your tests. It is the fastest way to spot expensive functions.

$ forge test --gas-report

| Function    | min   | avg   | median | max   | # calls |
| transfer    | 28012 | 34521 | 34521  | 51012 | 12      |
| approve     | 24300 | 24300 | 24300  | 24300 | 5       |

Gas Snapshots

forge snapshot writes the gas cost of every test to a .gas-snapshot file. Commit it to version control, then run forge snapshot --diff to see exactly how a change affected gas.

This turns gas regressions into reviewable diffs in pull requests.

$ forge snapshot
$ forge snapshot --diff

testTransfer() (gas: -1240 (-3.6%))
testMint() (gas: +85 (+0.2%))

Measuring in Tests

For fine-grained measurement, read gasleft() before and after a call inside a test. The difference is the gas consumed by that block of code.

uint256 before = gasleft();
target.doWork();
uint256 used = before - gasleft();
emit log_named_uint("gas used", used);

Verbose Traces

Running tests with -vvvv shows a full execution trace including the gas cost of each external call and opcode group. This reveals where gas is spent, not just the total.

$ forge test --match-test testTransfer -vvvv

[34521] Token::transfer(bob, 100)
  emit Transfer(from: alice, to: bob, value: 100)
  return: true

The Optimizer Setting

The Solidity optimizer changes runtime and deployment gas. The runs parameter is a hint about how often functions are called.

  • Low runs (e.g. 1) optimizes for cheap deployment
  • High runs (e.g. 10000) optimizes for cheap repeated calls

Set it in foundry.toml and always measure with the optimizer enabled, since it reflects production behavior.

# foundry.toml
[profile.default]
optimizer = true
optimizer_runs = 10000

Comparing Implementations

To compare two approaches, write a test that exercises each under identical conditions and inspect the gas report side by side.

Keep inputs the same and isolate the change to one variable, otherwise you cannot attribute the gas difference to the optimization you made.

function testNaive() public { c.sumNaive(data); }
function testOptimized() public { c.sumOptimized(data); }
// compare both rows in --gas-report

Beware Warm vs Cold Skew

Gas reports can mislead because the first access in a test is cold and later ones are warm. A function called once in setup may show a higher cold cost than the same function later.

Look at min, median, and max columns together rather than a single average, and design tests that reflect real-world access patterns.

Etherscan and Real Receipts

On-chain transaction receipts report the actual gasUsed. Etherscan and block explorers display this for every transaction, letting you validate your local measurements against mainnet reality.

The eth_estimateGas RPC method gives a pre-flight estimate, though it adds a safety margin and may differ from the real execution cost.

CI Gas Regression Gates

Wire forge snapshot --check into continuous integration. It fails the build if any test's gas exceeds the committed snapshot beyond a tolerance.

This prevents accidental gas regressions from slipping into production and makes gas a first-class quality metric.

$ forge snapshot --check
# exits non-zero if gas increased vs committed snapshot

A Measurement Workflow

A solid gas workflow:

  • Write tests covering the hot paths
  • Record a baseline with forge snapshot
  • Make one optimization at a time
  • Run forge snapshot --diff to confirm the gain
  • Gate regressions in CI with --check

Discipline beats cleverness.

Quick Check

Which Foundry command produces a per-function table of min, average, and max gas usage?

Recap

You learned to measure gas:

  • forge test --gas-report for per-function tables
  • forge snapshot --diff to track changes
  • gasleft() for fine-grained measurement
  • Verbose traces reveal where gas goes
  • Gate regressions in CI with --check

This completes the Gas Optimization course. Next: the Foundry toolkit in depth.

الأسئلة الشائعة

هل درس «قياس Gas» مجاني؟

نعم — نص درس «قياس Gas» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Web3 & DApp Development Fundamentals، انتقل إلى CoddyKit PRO. تتضمن دورة Web3 & DApp Development Fundamentals 4 دروس في المجموع.

ماذا ستتعلم في «قياس Gas»؟

أدوات تحليل الأداء تتمرن على Web3 & DApp Development Fundamentals مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Web3 & DApp Development Fundamentals؟

لا تُشترط خبرة سابقة. Web3 & DApp Development Fundamentals على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «قياس Gas»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Web3 & DApp Development Fundamentals هذا؟

نعم. كل درس في Web3 & DApp Development Fundamentals يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نموذج تكلفة Gas
  2. تحسين التخزين
  3. حيل الحلقات وCalldata
  4. قياس Gas
← العودة إلى Web3 & DApp Development Fundamentals