使用

gcc 4.6和-O3,我使用简单的时间命令计时以下四个代码

#include

int main(int argc, char* argv[])

{

double val = 1.0;

unsigned int numIterations = 1e7;

for(unsigned int ii = 0;ii < numIterations;++ii) {

val *= 0.999;

}

std::cout<

}

案例1在0.09秒内运行

#include

int main(int argc, char* argv[])

{

double val = 1.0;

unsigned int numIterations = 1e8;

for(unsigned int ii = 0;ii < numIterations;++ii) {

val *= 0.999;

}

std::cout<

}

案例2运行时间为17.6秒

int main(int argc, char* argv[])

{

double val = 1.0;

unsigned int numIterations = 1e8;

for(unsigned int ii = 0;ii < numIterations;++ii) {

val *= 0.999;

}

}

案例3在0.8秒内运行

#include

int main(int argc, char* argv[])

{

double val = 1.0;

unsigned int numIterations = 1e8;

for(unsigned int ii = 0;ii < numIterations;++ii) {

val *= 0.999999;

}

std::cout<

}

案例4在0.8秒内运行

我的问题是为什么第二种情况比其他所有情况都慢得多?案例3显示删除cout使运行时恢复与预期的一致.案例4表明,改变乘数也大大减少了运行时间.在案例2中没有进行哪些优化或优化以及为什么?

更新:

当我最初运行这些测试时,没有单独的变量numIterations,该值在for循环中被硬编码.通常,对此值进行硬编码会使得运行速度比此处给出的情况慢.对于案例3来说尤其如此,它几乎立即使用如上所示的numIterations变量运行,表明James McNellis对于整个循环的优化是正确的.我不确定为什么将1e8硬编码到for循环中会阻止在案例3中删除循环或在其他情况下使事情变慢,但是,案例2的基本前提明显更慢更为真实.

区分装配输出给出了上面给出的情况

案例2和案例1:

movl $100000000,16(%esp)

movl $10000000,16(%esp)

案例2和案例4:

.long -652835029

.long 1072691150

.long -417264663

.long 1072693245

c语言中for优化,c – 在For循环中发生了什么GCC优化?相关推荐

  1. c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...

    在C语言中,字符串不存放在一个变量中,而是存放在一个中 答:数组 中国大学MOOC: 请选择恰当的选项填入划线的空白处.国 生活習慣が違います. 答:によって 中国大学MOOC: 下列项目中,不应作为 ...

  2. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  3. c语言中sprintf函数_在C / C ++中使用sprintf()函数

    c语言中sprintf函数 In this article, we'll take a look at using the sprintf() function in C / C++. 在本文中,我们 ...

  4. c语言中isdigit函数_在C / C ++中使用isdigit()

    c语言中isdigit函数 In this article, we'll take a look at using the isdigit() function in C/C++. This is a ...

  5. c语言中int 3.6 =,(C语言中的常量)乐创DIY C语言讲义​——3.6节

    3.6 常量 常量,顾名思义就是在程序执行期间不会改变的固定值.在C语言中,常量的主要作用有两个,其一为给变量赋值,其二为与变量比较,作为判断条件. 在C语言程序中的常量有四大类,分别是整数型常量,浮 ...

  6. c语言中offset用法,offset的使用 汇编中OFFSET的用法和所指内容

    offset在C语言中使用是什么意思啊?? 请教 Excel VBA Range.offset 的用法 Range.Offset 属性 返回 Range 对象,它代表位于指定单元格区域的一定的偏移量位 ...

  7. c 语言中break是跳出本层循环,C break跳出多层循环

    C break跳出多层循环 在C/C++中,跳出多层循环有3中方法: 1.用break;加上一个辅助的标志变量. 2.用goto; 3.用try   ...   catch; 其中break对if-e ...

  8. java语言中if语句的基本语法_java中if语句有哪些形式和用法

    形式一:if语句 if语句是指如果满足某种条件,就进行某种处理.例如,小明妈妈跟小明说"如果你考试得了100分,星期日就带你去游乐场玩".这句话可以通过下面的一段伪代码来描述. 如 ...

  9. C语言中float double等类型在内存中的存储

    问题:十进制数4.5的单精度表示和双精度表示: 备注:   最高位符号位   0表示整数  1表示负数 阶码:  表示的是2的多少次幂这个幂指数 尾数:将其表示成科学计数法之后的舍去科学计数法表示的最 ...

最新文章

  1. SVA Function Coverage
  2. Python基础教程:列表、字典、集合推导式
  3. 正则表达式的知识普及
  4. 使用 nuget server 的 API 来实现搜索安装 nuget 包
  5. word把选择答案弄到题目里_老师们看过来,如何快速整理试题答案
  6. C#-JSON的序列化和反序列化
  7. flutter: 建树流程
  8. Java中的SOAP技术
  9. python开发软件的实例-由Python编写的MySQL管理工具代码实例
  10. 华为服务器修改SN,华为光猫修改双模、SN序号、MAC地址方法
  11. 原型工具Axure常见问题
  12. 概念模型转化为逻辑模型规律
  13. Jenkins执行shell命令,提示Pseudo-terminal will not be allocated because stdin is not a terminal.
  14. 《有效的单元测试》第三章
  15. margin与padding的区别
  16. Python 第二十六章 面向对象 元类+反射+双下方法
  17. 支付宝扫五福,你扫了吗
  18. dubbo分布式服务框架(高级特性篇)
  19. 「 LaTex 」写论文,作者旁添加ORCID
  20. Microsoft Word 教程:如何在 Word 中查找和替换文本?

热门文章

  1. 库克“一语成谶”:又有 30 万台安卓设备被“感染”了!| 文末福利
  2. Kubernetes 上调试 distroless 容器
  3. 打造大数据和AI能力底座 联通大数据深度参与“新基建”
  4. Nutanix在中国市场发布多云合作伙伴计划
  5. 群聊金山云与英特尔的“AI as a Service”,你都get到了什么?
  6. 19年兰州大学计算机分数线,兰州大学2019年在广东省录取分数线
  7. hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
  8. VS Code Element 提示 VSCode-Element-Helper 插件
  9. 开发经验分享_02_解决问题3步走(实战)
  10. 英雄联盟祖安服务器要维护多久,祖安玩家的春天!英雄联盟将回归队内语音,娱乐玩家遭殃了?...