Solidity之为什么 ++i 比 i++ 省gas

news2024/10/3 2:17:58

文章目录

  • 为什么 ++i 比 i++ 省gas
    • 测试验证
      • demo1
      • demo2
    • 为什么 ++i 比 i++ 省gas

为什么 ++i 比 i++ 省gas

i++通常更昂贵,因为它必须增加一个值并“返回”旧值,因此可能需要在内存中保存两个数字++我在记忆中只使用过一个数字。在许多情况下,在编译器优化之后,它们可能是等效的。

测试验证

demo1

为了验证,我在Remix中设置了两个合约:一个将使用i++,一个使用++i

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract IteratorTest {

    uint256 i = 999;

    function increment() public {
        i++;
    }

    function retrieve() public view returns (uint256){
        return i;
    }
}

i++ 测试花费gas:30324 gas

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract IteratorTest2 {

    uint256 i = 999;

    function increment() public {
        ++i;
    }

    function retrieve() public view returns (uint256){
        return i;
    }
}

++i 测试花费gas:30317 gas

总结:在两个合约中执行increment()函数。 i++ 测试花费gas:30324 gas,++i 测试花费gas:30317 gas。 ++i比 i++节省。

demo2

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract IteratorTest3 {
    uint256[] public arr = [1, 2, 3, 4, 5];

    function find() public view returns (bool) {
        for (
            uint256 i = 0;
            i < arr.length;
            i++ /*++i*/
        ) {
            if (arr[i] == 5) {
                return true;
            }
        }
        return false;
    }
}

i++ 花费gas: 36221

在这里插入图片描述++i花费gas:36201
在这里插入图片描述

总结: i++ 花费gas: 36221,++i花费gas:36201,确实 ++i节省gas。

为什么 ++i 比 i++ 省gas

原文地址:https://twitter.com/0xCygaar/status/1607860326271438848

作者使用debugger,对两者执行区别进行了分析:
i++ does actually save the original value before incrementing. We can see this behavior when stepping through our code. Here’s what the stack looked like for both contracts after the first section executed:

具体参考作者原文~

我做的第一件事是打开Remix debugger。对于那些不熟悉debugger的人,它是一种工具,可让您了解交易执行的每个EVM OPODE。

这就是为什么要知道assembly作为智能合约开发人员的重要性。

我主要使用指令面板(左中间,未命名)和堆栈面板(左下)。这些告诉我当时正在执行什么操作码以及堆栈的状态。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SVM】简单介绍(四)

1、Soft Margin SVM 对偶求解 构造拉格朗日函数 L12∥w∥2C∑i1nξi−∑i1nαi(yi(wTxib)−1ξi)−∑i1nγiξiαi≥0γi≥0\begin{aligned} & L\frac{1}{2}\|w\|^2C \sum_{i1}^n \xi_i-\sum_{i1}^n \alpha_i\left(y_i\left(w^T x_ib\right)-1\xi_i\right)-\sum_{i1}^n \ga…

dagum基尼系数分析全流程

Dagum系数分析 Dagum基尼系数是传统基尼gini系数的升级&#xff0c;其可分解为组内系数、组间系数和超变密度系数&#xff0c;即Dagum 组内Gw 组间Gb 超变密度Gt。 组内Gw分别反映各地区内部水平的差距、组间Gb反映各地区之间水平的差距&#xff0c;以及超变密度Gt反映各地区…

Strtus2漏洞 - Struts2-052 Struts2-057 Struts2-059

文章目录S2-052(CVE-2017-9805)环境搭建漏洞复现S2-057(CVE-2018-11776)环境搭建漏洞复现S2-059(CVE-2019-0230)环境搭建漏洞复现S2-052(CVE-2017-9805) 原理&#xff1a;Struts2 REST插件的XStream组件存在反序列化漏洞&#xff0c;使用XStream组件对XML格式的数据包进行反序…

为什么说DeFi隐私协议Unijoin.io具备趋势性

区块链技术以点对点、去中心化、公开透明、不可逆等作为其主要特点&#xff0c;而基于区块链的加密货币原生的具备了区块链技术的种种特性&#xff0c;这意味着通常每一笔链上交易都是透明可查的。虽然加密账户以“伪匿名”作为主要特点&#xff0c;但我们也同样看到&#xff0…

强大的ANTLR4(1)

以前对于《编译原理》这门课有一种恐惧&#xff0c;现在强大的工具越来越多&#xff0c;有些原理并不一定要非常清楚&#xff0c;也是可以设计一种编程语言的&#xff0c;那就是ANTLR4。 Antlr4&#xff08;全名&#xff1a;ANother Tool for Language Recognition&#xff09…

Redis集群系列六 —— 分片集群搭建

Redis 常用集群中&#xff0c;常用的几种集群方案有&#xff1a;主从集群、哨兵集群、分片集群&#xff0c;不同的集群对应着不同的场景&#xff0c;并且各种集群也都有不同的优劣&#xff0c;本篇将以 redis 分片集群为切入点。 主从和哨兵虽然解决了高可用、高并发读的问题&…

spring之IoC注解(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Spring注解的使用1、加入aop的依赖2、在配置文件中添加context命名空间3、在配置文件中指定扫描的包4、在Bean类上使用注解二、Bean的选择性实例化1、需求2、…

二十三种设计模式--系列篇(一)

一、软件设计模式的产生背景 “设计模式”最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年&#xff0c;美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexander&#xff09;在他的著作《…

(五)devops持续集成开发——jenkins发布一个maven流水线项目

前言 本节内容使用jenkins的maven流水线组件发布一个springboot项目&#xff0c;实现自动化部署一个后端项目。在开始流水化部署前我们需要准备好一个git项目&#xff0c;并在jenkins所在的服务器安装好git客户端便于源码的拉取。并且需要安装一个ssh插件&#xff0c;将我们的…

C++学习:多态与运算符(Day.7~)

总结让人明白。 表明覆盖意图的限定符 override 如图&#xff1a; 说明&#xff1a;1.使用关键字const后&#xff0c;由于函数特征不同&#xff0c;派生类不会再隐藏基类方法 2.想要覆盖基类方法可使用关键字override&#xff0c;此关键字会强制覆盖基类方法&#xff0c;若…

微信功能,你知道多少

用了微信很多年&#xff0c;选择才发现微信收藏的正确打开方式&#xff01;感觉之前白用了那么久微信收藏&#xff0c;只用来保存消息实在是太可惜了&#xff0c;原来它还有那么多实用功能&#xff01;协助日常安排如果每天需要做的事情比较多&#xff0c;可以在这里记录日常工…

谷粒商城之高级篇知识补充

谷粒商城高级篇之知识补充 前言 本篇主要是完成谷粒商城高级篇开发时&#xff0c;我们需要了解并学习一部分补充的知识&#xff0c;才能更好的完成商城业务。 以后我们将商城任务和额外知识分开来编写&#xff0c;方便商城业务的连贯性。 下面是本篇文章各个章节对应的相应…

Apollo星火计划学习笔记——Apollo速度规划算法原理与实践

文章目录1. 速度规划算法总体介绍1.2 不同场景下的ST图1.2.1 主车向前匀速行驶1.2.2 主车先向前匀速行驶&#xff0c;后停车1.2.3 主车跟随前车行驶1.2.4 主车跟随前车刹停1.2.5 障碍车在主车后方跟行1.3 速度规划算法整体流程1.3.1 Task&#xff1a; SPEED_BOUNDS_PRIORI_DECI…

数据结构-堆

1、什么是堆 堆是一种满足以下条件的树&#xff1a;堆中的每一个节点值都大于等于&#xff08;或小于等于&#xff09;子树中所有节点的值。 2、堆的用途 当我们只关心所有数据中的最大值或者最小值&#xff0c;存在多次获取最大值或者最小值&#xff0c;多次插入或删除数据时&…

ArrayList与顺序表(一)

目录 1.线性表 2.顺序表 2.1接口的实现 3.ArrayList的简介 4.ArrayList使用 4.1ArrayList的构造 4.2ArrayList常见的操作 4.3ArrayList的遍历 4.4ArrayList的扩容机制 5.模拟实现一个ArrayList 1.线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。线性…

[思考进阶]04 优秀的人,都在使用“微习惯”

除了要提升自己的技术能力&#xff0c;思维的学习和成长也非常非常重要&#xff0c;特推出此[思考进阶]系列&#xff0c;进行刻意练习&#xff0c;从而提升自己的认知。 我有个微信群&#xff0c;人很少&#xff0c;都是兄弟&#xff0c;每天打开电脑的时候&#xff0c;我都会有…

朴素贝叶斯分类的python的实现

文章目录介绍GaussianNB()参数介绍实例BernoulliNB()参数介绍实例MultinomialNB()参数介绍实例作者&#xff1a;王乐介绍 sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。 sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,…

Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

写在开头 对于Java领域中的锁&#xff0c;其实从接触Java至今&#xff0c;我相信每一位Java Developer都会有这样的一个感觉&#xff1f;不论是Java对锁的实现还是应用&#xff0c;真的是一种“群英荟萃”&#xff0c;而且每一种锁都有点各有各的驴&#xff0c;各有各的本&…

#P13787. [NOIP2021] 报数

目录 一&#xff0c;题目 二&#xff0c;题意分析 三&#xff0c;做法 1.直接模拟题意 2&#xff0c;用筛法来解 3&#xff0c;正解(加上记忆化) 一&#xff0c;题目 二&#xff0c;题意分析 题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数…

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库&#xff0c;跟磁盘数据库相比&#xff0c;完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型&#xff0c;String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑&#xff0c;目的…