c语言中for优化,c – 在For循环中发生了什么GCC优化?
使用
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优化?相关推荐
- c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...
在C语言中,字符串不存放在一个变量中,而是存放在一个中 答:数组 中国大学MOOC: 请选择恰当的选项填入划线的空白处.国 生活習慣が違います. 答:によって 中国大学MOOC: 下列项目中,不应作为 ...
- C语言中static的作用及C语言中使用静态函数有何好处
转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...
- c语言中sprintf函数_在C / C ++中使用sprintf()函数
c语言中sprintf函数 In this article, we'll take a look at using the sprintf() function in C / C++. 在本文中,我们 ...
- 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 ...
- c语言中int 3.6 =,(C语言中的常量)乐创DIY C语言讲义——3.6节
3.6 常量 常量,顾名思义就是在程序执行期间不会改变的固定值.在C语言中,常量的主要作用有两个,其一为给变量赋值,其二为与变量比较,作为判断条件. 在C语言程序中的常量有四大类,分别是整数型常量,浮 ...
- c语言中offset用法,offset的使用 汇编中OFFSET的用法和所指内容
offset在C语言中使用是什么意思啊?? 请教 Excel VBA Range.offset 的用法 Range.Offset 属性 返回 Range 对象,它代表位于指定单元格区域的一定的偏移量位 ...
- c 语言中break是跳出本层循环,C break跳出多层循环
C break跳出多层循环 在C/C++中,跳出多层循环有3中方法: 1.用break;加上一个辅助的标志变量. 2.用goto; 3.用try ... catch; 其中break对if-e ...
- java语言中if语句的基本语法_java中if语句有哪些形式和用法
形式一:if语句 if语句是指如果满足某种条件,就进行某种处理.例如,小明妈妈跟小明说"如果你考试得了100分,星期日就带你去游乐场玩".这句话可以通过下面的一段伪代码来描述. 如 ...
- C语言中float double等类型在内存中的存储
问题:十进制数4.5的单精度表示和双精度表示: 备注: 最高位符号位 0表示整数 1表示负数 阶码: 表示的是2的多少次幂这个幂指数 尾数:将其表示成科学计数法之后的舍去科学计数法表示的最 ...
最新文章
- SVA Function Coverage
- Python基础教程:列表、字典、集合推导式
- 正则表达式的知识普及
- 使用 nuget server 的 API 来实现搜索安装 nuget 包
- word把选择答案弄到题目里_老师们看过来,如何快速整理试题答案
- C#-JSON的序列化和反序列化
- flutter: 建树流程
- Java中的SOAP技术
- python开发软件的实例-由Python编写的MySQL管理工具代码实例
- 华为服务器修改SN,华为光猫修改双模、SN序号、MAC地址方法
- 原型工具Axure常见问题
- 概念模型转化为逻辑模型规律
- Jenkins执行shell命令,提示Pseudo-terminal will not be allocated because stdin is not a terminal.
- 《有效的单元测试》第三章
- margin与padding的区别
- Python 第二十六章 面向对象 元类+反射+双下方法
- 支付宝扫五福,你扫了吗
- dubbo分布式服务框架(高级特性篇)
- 「 LaTex 」写论文,作者旁添加ORCID
- Microsoft Word 教程:如何在 Word 中查找和替换文本?
热门文章
- 库克“一语成谶”:又有 30 万台安卓设备被“感染”了!| 文末福利
- Kubernetes 上调试 distroless 容器
- 打造大数据和AI能力底座 联通大数据深度参与“新基建”
- Nutanix在中国市场发布多云合作伙伴计划
- 群聊金山云与英特尔的“AI as a Service”,你都get到了什么?
- 19年兰州大学计算机分数线,兰州大学2019年在广东省录取分数线
- hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
- VS Code Element 提示 VSCode-Element-Helper 插件
- 开发经验分享_02_解决问题3步走(实战)
- 英雄联盟祖安服务器要维护多久,祖安玩家的春天!英雄联盟将回归队内语音,娱乐玩家遭殃了?...