Gas statistics for your test runs
Hardhat can optionally show statistics on the gas consumed by your contractsβ public functions during a test run. Use the --gas-stats flag when running your tests to display this information.
Getting gas statistics from your tests
Section titled βGetting gas statistics from your testsβYou can pass the --gas-stats flag to either the test task or to one of its subtasks (e.g., test solidity):
npx hardhat test --gas-statsnpx hardhat test solidity --gas-statsnpx hardhat test nodejs --gas-statspnpm hardhat test --gas-statspnpm hardhat test solidity --gas-statspnpm hardhat test nodejs --gas-statsyarn hardhat test --gas-statsyarn hardhat test solidity --gas-statsyarn hardhat test nodejs --gas-statsThis prints a table like the following:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Gas Usage Statistics ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Calculator.sol:Calculator ββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬βββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββΌββββββββββΌβββββββββΌββββββββΌβββββββββ’β divide β 44316 β 44316 β 44316 β 44316 β 1 ββ multiply(uint256,uint256) β 44254 β 44254 β 44254 β 44254 β 2 ββ multiply(uint256,uint256,uint256) β 44875 β 44875 β 44875 β 44875 β 1 ββ reset β 21485 β 21485 β 21485 β 21485 β 1 ββ result β 23510 β 23510 β 23510 β 23510 β 6 ββ subtract β 44213 β 44213 β 44213 β 44213 β 1 ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββΌββββββββββ΄βββββββββ΄ββββββββ΄βββββββββ’β Deployment Cost β Deployment Size β ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ€ ββ 288115 β 1120 β ββββββββββββββββββββββββββββββββββββββ§ββββββββββββββββββ§ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Counter.sol:Counter ββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬βββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββΌββββββββββΌβββββββββΌββββββββΌβββββββββ’β add(uint256) β 43915 β 43915 β 43915 β 43915 β 1 ββ add(uint256,bool) β 44284 β 44419 β 44419 β 44554 β 2 ββ inc β 43482 β 43482 β 43482 β 43482 β 1 ββ x β 23466 β 23466 β 23466 β 23466 β 5 ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββΌββββββββββ΄βββββββββ΄ββββββββ΄βββββββββ’β Deployment Cost β Deployment Size β ββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ€ ββ 234940 β 870 β ββββββββββββββββββββββββββββββββββββββ§ββββββββββββββββββ§ββββββββββββββββββββββββββββββββββββThe statistics are collected from the functions called by the tests you executed. This means that running test solidity --gas-stats will produce a different result than running test nodejs --gas-stats, because different tests will have been run.
Exporting gas statistics to a JSON file
Section titled βExporting gas statistics to a JSON fileβTo save gas statistics to a JSON file, pass the --gas-stats-json <path> flag:
npx hardhat test --gas-stats-json gas-stats.jsonnpx hardhat test solidity --gas-stats-json gas-stats.jsonnpx hardhat test nodejs --gas-stats-json gas-stats.jsonpnpm hardhat test --gas-stats-json gas-stats.jsonpnpm hardhat test solidity --gas-stats-json gas-stats.jsonpnpm hardhat test nodejs --gas-stats-json gas-stats.jsonyarn hardhat test --gas-stats-json gas-stats.jsonyarn hardhat test solidity --gas-stats-json gas-stats.jsonyarn hardhat test nodejs --gas-stats-json gas-stats.jsonThis flag works independently of --gas-stats, so either or both can be used together. For example, to print the table to the terminal and also save the results to a file:
npx hardhat test --gas-stats --gas-stats-json gas-stats.jsonpnpm hardhat test --gas-stats --gas-stats-json gas-stats.jsonyarn hardhat test --gas-stats --gas-stats-json gas-stats.jsonThe JSON file has the following structure:
{ "contracts": { "contracts/Calculator.sol:Calculator": { "sourceName": "contracts/Calculator.sol", "contractName": "Calculator", "deployment": { "min": 288115, "max": 288115, "avg": 288115, "median": 288115, "count": 1 }, "functions": { "divide": { "min": 44316, "max": 44316, "avg": 44316, "median": 44316, "count": 1 }, "multiply(uint256,uint256)": { "min": 44254, "max": 44254, "avg": 44254, "median": 44254, "count": 2 } // ... } }, "contracts/Counter.sol:Counter": { "sourceName": "contracts/Counter.sol", "contractName": "Counter", "deployment": { "min": 234940, "max": 234940, "avg": 234940, "median": 234940, "count": 1 }, "functions": { "add(uint256)": { "min": 43915, "max": 43915, "avg": 43915, "median": 43915, "count": 1 }, "add(uint256,bool)": { "min": 44284, "max": 44554, "avg": 44419, "median": 44419, "count": 2 } // ... } } }}Understanding the gas statistics
Section titled βUnderstanding the gas statisticsβThe gas statistics table shows the following information for each function:
- count: Number of times the function was called
- min: Minimum gas consumed in a single call
- max: Maximum gas consumed in a single call
- avg: Average gas consumed across all calls
- median: Median gas consumed across all calls
For deployments, the table shows:
- gas: Gas cost of executing the deployment
- size: Size of the deployed bytecode in bytes
Functions included in gas statistics
Section titled βFunctions included in gas statisticsβGas statistics only include public functions that are called directly by your tests. If a public function is called by another function but not directly by a test, it wonβt be included in the statistics.
For example, consider this contract:
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
contract Counter { uint256 public count;
function inc() public { _incInternal(); }
function _incInternal() private { count++; }
function incBy(uint256 value) public { count += value; }
function reset() public { count = 0; }}And this test:
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
import "./Counter.sol";
contract CounterTest { Counter counter;
function setUp() public { counter = new Counter(); }
function testInc() public { counter.inc(); }
function testIncBy() public { counter.incBy(5); }}The output will be:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Gas Usage Statistics ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Counter.sol:Counter ββββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬βββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββΌββββββββββββββββββΌββββββββββΌβββββββββΌββββββββΌβββββββββ’β inc β 43484 β 43484 β 43484 β 43484 β 1 ββ incBy β 43937 β 43937 β 43937 β 43937 β 1 ββββββββββββββββββββΌββββββββββββββββββΌββββββββββ΄βββββββββ΄ββββββββ΄βββββββββ’β Deployment Cost β Deployment Size β ββββββββββββββββββββΌββββββββββββββββββ€ ββ 179915 β 616 β ββββββββββββββββββββ§ββββββββββββββββββ§ββββββββββββββββββββββββββββββββββββThe statistics include inc and incBy because theyβre called directly by the tests. The reset() function doesnβt appear because itβs never called by the tests. The _incInternal() function doesnβt appear because itβs private and only called by inc(), not directly by the tests.