함수에서 스토리지 액세스 방지 - 1

많은 경우 메모리(로컬 변수)에서 데이터에 액세스하는 것이 스토리지(상태 변수)에서 데이터에 액세스하는 것보다 저렴합니다.

그러나 항상 그런 것은 아니며 메모리에 복사할 때 몇 가지 추가 단계가 필요한 상황이 있을 수 있습니다.
이 사례는 다른 게시물에서 실험해 보겠습니다.

이제 일반적인 경우에 초점을 맞추겠습니다. 다음 계약을 고려하십시오.

contract varReferencing_1{
    uint iterations = 10;
    uint public sum;

    function addItem() external {
        for(uint i; i < iterations; i++) { // reference from storage
            sum++; // updating storage
        }
    }

}

contract varReferencing_2{
    uint iterations = 10;
    uint public sum;

    function addItem() external {
        uint _iterations = iterations; // creating a copy in memory
        uint _sum = sum; // creating a copy in memory

        for(uint i; i < _iterations; i++) { // reference from memory
            _sum++; // updating in memory
        }
        sum = _sum; // updating in storage
    }
}


varReferencing_1과 varReferencing_2는 모두 똑같은 일을 하고 있습니다. 유일한 차이점은 varReferencing_1의 addItem()가 저장소에서 직접 액세스하고 varReferencing_2에서 메모리에 복사본을 만든 다음 액세스한다는 것입니다.

결과:



varReferencing_1addItem()


varReferencing_2addItem()


관찰:
메모리 액세스를 사용하는 동안 가스 소비가 줄어듭니다.

좋은 웹페이지 즐겨찾기