比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

news2024/12/26 23:23:39

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

前言

对i++和++i的争论褒贬不一,不知从何时起(大概是学C的时候老师就是这么教的)我的习惯是在for循环中使用i++而不是++i

for (int i = 0; i < n; i++)  // 典

但是看到一些博客说++i比i++的效率高。

虽然现在的编译器的优化、机器的性能提升之类导致i++和++i的区别应该不会很大,但我还是决定做一个实验进行一下对比。

实验环境

  • 操作系统:deepin 5.3.15-6apricot
  • g++版本:gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild)
  • screen版本:Screen version 4.06.02 (GNU) 23-Oct-17

实验步骤

首先编写了两个简单的cpp文件,分别命名为i++.cpp和++i.cpp

其中i++.cpp为:

#include <iostream>
#include <time.h>
using namespace std;

#define forTo 10000000000000
#define perCout 1000000000

int main() {
    clock_t start = clock();
    for (long long i = 0; i < forTo; i++) {
        if (i % perCout == 0) {
            cout << i << "(" << 100. * i / forTo << "%)" << endl;
        }
    }
    puts("End..");
    cout << "Time consume: " << double(clock() - start) / CLOCKS_PER_SEC << endl;
    return 0;
}

++i.cpp为:

#include <iostream>
#include <time.h>
using namespace std;

#define forTo 10000000000000
#define perCout 1000000000

int main() {
    clock_t start = clock();
    for (long long i = 0; i < forTo; ++i) {
        if (i % perCout == 0) {
            cout << i << "(" << 100. * i / forTo << "%)" << endl;
        }
    }
    puts("End..");
    cout << "Time consume: " << double(clock() - start) / CLOCKS_PER_SEC << endl;
    return 0;
}

上述两个文件的主要部分都是一个循环,一共循环10000000000000次,每循环1000000000次打印一次

二者唯一的区别是第10行

+     for (long long i = 0; i < forTo; i++) {
-     for (long long i = 0; i < forTo; ++i) {

接着开启三个screen终端,在每个终端中分别编译源文件。三个终端的名称分别为i++、++i和i++O2

  • 在终端i++中,使用指令g++ -O0 i++.cpp -o i++进行编译
  • 在终端++i中,使用指令g++ -O0 ++i.cpp -o ++i进行编译
  • 在终端i++O2中,使用指令g++ -O2 i++.cpp -o i++O2进行编译

前两个终端不使用O2优化,第三个终端使用O2优化

为了使实验尽可能地在相同的条件下运行,提前在三个终端中输入好运行指令:./i++./++i./i++O2

接着以尽快的速度(1秒内)在三个终端中分别键入回车,让三个程序在尽可能短的时间内“同时”启动运行并等待结果。

init

经过一段时间后(约7h),我们得到了运行结果:

result

结果显示:

  1. 在for循环中使用i++计算10000000000000次,每1000000000次打印一次,所消耗的时间为23688.9秒
  2. 在for循环中使用++i计算10000000000000次,每1000000000次打印一次,所消耗的时间为23806.2秒
  3. 在for循环中使用i++计算10000000000000次,每1000000000次打印一次,并开启O2优化,所消耗的时间为8953.8秒

这表明:

  1. i++并且开O2优化的执行时间“远”小于i++或++i不开优化的执行时间
  2. 不开启O2优化的情况下,i++和++i的效率相差不大,使用++i的耗时略长,使用i++的时间消耗约为++i的99.507%

进一步实验:

在上述实验中,虽说每隔1000000000次打印一次,但在循环中仍打印了10000次。这1万次的打印会消耗不少的时间,并且也可以引起一定的误差。

因此,在实验二中,我们取消了循环中的打印,只保留循环结束后的时间打印。

同样新建了两个简单的cpp文件:i++NC.cpp和++iNC.cpp。其中NC的意思是:Not Cout

i++NC.cpp为:

#include <iostream>
#include <time.h>
using namespace std;

#define forTo 10000000000000
#define perCout 1000000000

int main() {
    clock_t start = clock();
    for (long long i = 0; i < forTo; i++) {
        ;
    }
    puts("End..");
    cout << "Time consume: " << double(clock() - start) / CLOCKS_PER_SEC << endl;
    return 0;
}

++iNC.cpp为

#include <iostream>
#include <time.h>
using namespace std;

#define forTo 10000000000000
#define perCout 1000000000

int main() {
    clock_t start = clock();
    for (long long i = 0; i < forTo; ++i) {
        ;
    }
    puts("End..");
    cout << "Time consume: " << double(clock() - start) / CLOCKS_PER_SEC << endl;
    return 0;
}

二者的唯一区别仍为第10行

接着使用类似实验一的方式在三个终端中对文件进行编译、执行

编译命令分别为:

  1. g++ -O0 i++.cpp -o i++
  2. g++ -O0 ++i.cpp -o ++i
  3. g++ -O2 i++.cpp -o i++O2

执行程序的命令分别为:

  1. ./i++NC
  2. ./++iNC
  3. ./i++NCO2

init2

接近同时(1秒内)启动三个程序,并观察运行结果

result2

可以看到:

  1. 在for循环中使用i++计算10000000000000次,所消耗的时间为16987秒
  2. 在for循环中使用++i计算10000000000000次,所消耗的时间为16994.3秒
  3. 在for循环中使用i++计算10000000000000次,并开启O2优化,所消耗的时间为2.2e-05秒

这表明:

  1. i++并且开O2优化的执行时间小于i++或++i不开优化的执行时间
  2. 不开启O2优化的情况下,i++和++i的效率相差不大,使用++i的耗时略长,使用i++的时间消耗约为++i的99.957%

Conclusion

  1. O2优化很多时候确实能够大大提高代码的执行效率
  2. (在for循环中使用)i++和++i的区别真的不大,按照自己喜欢的使用就好

End

附 本实验所有文件的MD5值:(使用命令:md5sum 文件名计算得到)

文件MD5值
++ia0a4916914604260d15f915b69bd6680
++i.cpp87f7bce79f6da8aab379d50855623b49
++iNC8f3824486c3eda26ee7c687b48fddf17
++iNC.cppc83f8a7252ab83b7c1aacc1371464711
i++d706151497301d37c17f2766231493c1
i++.cppce237f15c3b2376f064c036985389d40
i++NCf92ba414cd60df7d44a62bca23378d61
i++NC.cpp163bc47ce3176b73306568ef542eb3a0
i++NCO27f2e8e8998361aab19e4c1decf29026a
i++O24f8cbacc480c8dbf5a62e433535bc9b1
The Real End, Thanks!

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/128675905

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

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

相关文章

再说多线程(五)——死锁

在前面四节中&#xff0c;我们一直没有讨论多线程程序的一个负面问题——死锁&#xff0c;有了一定的基础&#xff0c;现在是时候研究一下死锁了。死锁一定是出现在多线程程序中&#xff0c;单线程是不可能造成死锁的&#xff0c;因为你不可能同时加两把锁。死锁有个简单的例子…

《软件工程》课程四个实验的实验报告(《可行性研究与项目计划》《需求分析》《系统设计》《系统实现》)

实验1《可行性研究与项目计划》 实验学时&#xff1a; 2 实验地点&#xff1a; 任意 实验日期&#xff1a; 12月15日 一、实验目的 了解&#xff1a;软件项目可行性研究及项目计划的基本原理与方法&#xff1b;掌握&#xff1a;Visio等工具进行可…

【尚硅谷】Java数据结构与算法笔记06 - 算法复杂度详解

文章目录一、算法的时间复杂度1.1 度量算法执行时间的两种方法1.1.1 事后统计1.1.2 事前估算1.2 时间频度1.2.1 基本介绍1.2.2 举例说明&#xff1a;基本案例1.2.3 举例说明&#xff1a;忽略常数项1.2.4 举例说明&#xff1a;忽略低次项1.2.5 举例说明&#xff1a;忽略系数1.3 …

WebServer传输大文件致客户端自动关闭

程序运行在云服务器上, Ubuntu 20.04LTS系统&#xff0c;用浏览器测试能正常打开页面&#xff0c;请求一般的html文本和几十kb的小图片无问题&#xff0c;接着放了一个1.63MB&#xff08; 1714387字节&#xff09;的网上找的图过去&#xff0c;客户端图没加载完就自动断连了&am…

如何搭建一个专业的企业知识库

当客户跟你达成合作关系后&#xff0c;需要持续的关系维护&#xff0c;在一定的销售点&#xff0c;定期和客户沟通&#xff0c;据调查&#xff0c;赢得一个新客户的成本可能是保留一个现有客户的5到25倍&#xff0c;作为营销策略&#xff0c;客户服务支持必须满足他们的期望。建…

Linux小黑板(7):再谈动静态

"我看到&#xff0c;久违的晴朗啊"一、什么是动静态库在本栏目前面的篇幅也提到过这个概念&#xff0c;因此本小节就小小地回顾一番。在linux下:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。动态库(.so):程序在运行的时候才去链接动态库的代码&am…

【npm报错】解决invalid json response body at https://registry.npmjs.org

报错信息&#xff1a; npm ERR! code FETCH_ERROR npm ERR! errno FETCH_ERROR npm ERR! invalid json response body at https://registry.npmjs.org/riophae%2fvue-treeselect reason: Invalid response body while trying to fetch https://registry.npmjs.org/riophae%2f…

从粪便菌群移植到下一代有益菌:Anaerobutyricum soehngenii为例

谷禾健康 我们知道&#xff0c;肠道微生物群对人类健康和福祉很重要&#xff0c;调节宿主代谢&#xff0c;塑造免疫系统并防止病原体定植。 通过粪便微生物群移植&#xff08;FMT&#xff09;恢复平衡多样的微生物群&#xff0c;已成为研究疾病发病机制中微生物群因果关系的潜在…

Spring Cloud Gateway 之限流

文章目录一、常见的限流场景1.1 限流的对象1.2 限流的处理方式1.3 限流的架构二、常见的限流算法2.1 固定窗口算法&#xff08;Fixed Window&#xff09;2.2 滑动窗口算法&#xff08;Rolling Window 或 Sliding Window&#xff09;2.3 漏桶算法&#xff08;Leaky Bucket&#…

CSS3属性之text-overflow:ellipsis详解

1.text-overflow: 默认值:clip; 适用于:所有元素 clip:当前对象内文本溢出时不显示省略标记(…),而是将溢出部分裁剪。 ellipsis:当对象内文本一处时显示省略标记(…)。 当然这还是不够的&#xff0c;需要加点调料才能出现效果: 那就是配合 overflow:hidden white-space:…

高级树结构之红黑树初识

文章目录一 红黑树简介二 探究变色、旋转操作的时机三 总结一 红黑树简介 通过在插入几点时维护数的平衡&#xff0c;这样就不会出现极端情况&#xff0c;使得整棵树的查找效率急剧降低。但是这样造成系统开销过大&#xff0c;因为一旦平衡因子的绝对值超过一就失衡&#xff0…

iOS 界面尺寸居然跟实际机型不符!

0x00 前言 日常搬砖过程中&#xff0c;一条日志&#xff0c;让我对手里的 iPhone 6 Plus 产生了怀疑&#xff1f; 这是 6P&#xff0c;怎么尺寸变成 6 了呢&#xff1f; 0x01 对比 手机连上电脑&#xff0c;通过 Xcode 查看 Window 菜单&#xff1a;Devices and Simulators …

Insight Enterprises EDI 855 采购订单确认报文详解

本文着重讲述Insight EDI项目中Insight回复给采购商的X12 855报文&#xff08;采购订单确认&#xff09;。 在此前的文章如何读懂X12报文中&#xff0c;我们对X12报文的结构已经做了详细的介绍&#xff0c;本文将带大家深入了解X12 855采购订单确认报文。 下图为Insight X12 …

单绞机张力开环控制(绞臂行星差速机构)

PLC的开环和闭环张力控制算法,可以参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc张力控制程序_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的…

Java学习之final关键字

目录 一、基本介绍 二、使用final的四种情况 第一种 第二种 第三种 第四种 三、细节 第一点 第二点 第三点 第四点 第五点 第六点 第七点 第八点 第九点 四、练习 第一题 第二题 分析 一、基本介绍 final:最终的&#xff0c;最后的 final 可以修饰类…

图形编辑器:旋转选中的元素

大家好&#xff0c;我是前端西瓜哥。 最近更文比较少&#xff0c;是因为本人在做个人开源项目&#xff0c;用 Canvas 做一个设计工具&#xff0c;做个乞丐版 figma。期间遇到了不少问题&#xff0c;在这里记录一下。 今天开始会恢复高频更新的&#xff0c;一两天一更。内容主…

Linux网络服务管理防火墙详解端口问题

每次配置访问服务器都会一团迷雾&#xff0c;今天来尝试弄清楚同时借鉴一下大佬的博文当做笔记 文章目录防火墙简介一、防火墙基础二、iptables防火墙策略iptables 命令格式&#xff1a;iptables案例1.查看开放的端口2.开放端口&#xff08;此处以80端口为例&#xff09;3.关闭…

超级详细的PMP复习方法,3A拿下考试不发愁!

如果问我是怎么一次性通过考试的&#xff0c;那绝对不只是运气&#xff0c;没有一点基本的实力怎么有底气通过考试呢&#xff0c;所以今天我们不讲什么刷题技巧&#xff0c;基础不牢靠将技巧都是没用的&#xff0c;今天我们先讲讲要怎么巩固基础&#xff0c;给到朋友们分享一些…

kaggle平台学习复习笔记 | 特征工程

目录数值字段roundBox/Bins类别字段onehotLabelEncoderOrdinal EncodingBinaryEncoderFrequency/Count EncodingMean/Target Encoding日期字段特征筛选feature_importances_利用方差利用相关性利用线性模型迭代消除排列重要性(Permutation Importance)特征工程决定了模型精度的…

MATLAB-RBF神经网络例1

采用所描述的系统中﹐假设真实质量为m2,在仿真中,初始值为,采用的自适应律为&#xff1a;设定参数为y0.5,10,25,6&#xff0c;分别设定参考位置为r(t)0,r(t )sin(4t) ,初始条件为&#xff0c;。图1.1和图1.2为指令r(t)0时控制效果,图1.3和图1.4为指令r(t)sin(4t )时的控制效果。…