Gas optimization Series Part -2

Today we'll briefly look into caching state variables

It is always better to cache a state variable if you can. What does caching a state variable even mean? It's a jargon word to scare off people. In essence, it's simply the act of copying state variable value to a local variable that resides in memory. Accessing a state variable uses SLOAD opcode which uses 100 gas for each load operation. Whereas accessing a local memory variable executes MLOAD opcode which only uses only 3 gas. That can make a huge difference if you're iterating over a list.

Let's look at the example:

pragma solidity 0.8.17;

contract MyContract{
    uint256 counter;

    function noCache() public {
        for(uint i =0; i < 100; i++){
            counter += 1;
        }
    }    

    function cache() public{
        uint256 cachedCounter = counter;
        for(uint i =0; i < 100; i++){
            cachedCounter += 1;
        }
        counter = cachedCounter;
    }
}

We have a counter state variable and two function that increments the counter 100 times. "noCache()" directly accesses the state variable every iteration, while "cache()" caches the state variable in a local cachedCounter and after the loop stores back to the state variable.

In the first non cached function with no gas the gas cost was:

While for the second cached function the gas cost was:

73997 gas from 118611, Big difference right? So always cache it if you can.