这段代码的执行时间

do_fork 2009-11-13 12:26:51
#include <stdio.h>

int main()
{
int i,j;
for (i=0; i<99999999; i++)
for (j=0; j<99999999; j++)
;//nothing to do
}



gcc t.c 编译
执行时间很久,等不到结束,人工终止它了

gcc -O t.c 编译
瞬间执行完毕

gcc优化后, 实际上代码是这样的
#include <stdio.h>

int main()
{
}



VC编译器,应该也能对此类代码也有所优化,
是默认优化还是需要打开哪个开关?
...全文
335 点赞 收藏 36
写回复
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
a364604 2009-11-14
来学习的,结果…………
晕了
up
回复
mmilmf 2009-11-13
优化的时候要使用release版本
回复
mmilmf 2009-11-13
主要通过VC的菜单项Project->Settings->C/C++->Category->Optimizations:代码优化设置。可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。
回复
jackyjkchen 2009-11-13
现在回答问题:

问题一:我个人的感觉啊,可能楼主不用VC,debug、release双默认版本的感受不是那么清晰,在VC的设计原则中,debug就是老老实实按照C语句进行汇编的,不做任何优化,无论这种优化有没有副作用(我可以说VC的O1、O2优化都没有副作用,由于VC的优化所直接造成的软件逻辑问题是极少的,那为什么VC不默认就O2呢?)。而且软件情况复杂,编译器又如何判断某种代码就完全不会用到而将及优化掉呢?而且,优化逻辑可能是交叉的或多作用的,优化掉楼主的循环的优化逻辑还可能会有其他动作……最重要的是,debug模式是给人调试的,要的就是完全按照代码明文所确定的逻辑来跑,如果调试的流程和代码所体现的不同,会造成混乱!
回复
jackyjkchen 2009-11-13
VC2008,不加优化老老实实算
只要加优化,o1,o2,ox都是优化成空的函数

反汇编指令只剩下
00401000 xor eax,eax
00401002 ret
回复
baihacker 2009-11-13
vc9,DEBUG禁用优化很长
release:
最大化速度(/O2) 瞬间
完全优化(/Ox) 瞬间
最小化大小(/O1) 瞬间
回复
do_fork 2009-11-13
两个问题,1个100分

问题一,
这种优化,若没有副作用(包括潜在的),编译器没理由加个开关,副作用是什么呢?
(用这种循环实现sleep本身就是不良做法,应该避免的,所以这类用法不算)

问题二,
除了用volatile修饰以外,还有什么方法可以在不关闭优化开关的情况下,抑制这个优化?
(不能增加无谓的运算)
回复
desdouble 2009-11-13
[Quote=引用 15 楼 do_fork 的回复:]
引用 12 楼 jackyjkchen 的回复:
就比较流行的静态语言开发工具来说,我见过的只有delphi,在默认情况下就把优化开得很足,delphi的编译选项较少,而且也不会对代码速度造成较大的影响,这与delphi的用途——快速图形开发有关,也与pascal的语言特点——比较固定比较明确(逻辑上容易处理)有关。


delphi给我留下的印象是,编译起来速度超快,也许是因为同出一门的BCB实在太慢了


刚才我试过了,gcc  -O打开的25个参数,全部打开,也没有优化掉它,
看来通过编译器参数做调整,gcc里是没法达到目的了
[/Quote]

GCC版本的问题。4.0.0优化不掉LZ的C代码。但gcc4.3.2可以。
回复
jernymy 2009-11-13
mark一下
回复
2009-11-13
静态围观大牛们讨论~~
回复
james_hw 2009-11-13
mark一下,虽然不是太需要深入了解,知道一点总是好的
回复
小明哥-Jimmy 2009-11-13
[Quote=引用楼主 do_fork 的回复:]
C/C++ code#include<stdio.h>int main()
{int i,j;for (i=0; i<99999999; i++)for (j=0; j<99999999; j++)
;//nothing to do}


gcc t.c 编译
执行时间很久,等不到结束,人工终止它了

gcc -O t.c 编译
瞬间执行完毕

gcc优化后, 实际上代码是这样的
C/C++ code#include<stdio.h>int main()
{
}


VC编译器,应该也能对此类代码也有所优化,
是默认优化还是需要打开哪个开关?
[/Quote]
.
回复
desdouble 2009-11-13
就这么沉了?
回复
飞雪再次出没,收藏了。
回复
liuchui2009 2009-11-13
我是过来学习的

结果还是没学懂

差距啊 先mark 有时间好好琢磨下
回复
fthislife 2009-11-13
回复
冰岛男孩 2009-11-13
mark
回复
zgjxwl 2009-11-13
up
回复
magicpang 2009-11-13
[Quote=引用 11 楼 do_fork 的回复:]
引用 4 楼 jackyjkchen 的回复:
现在回答问题:

问题一:我个人的感觉啊,可能楼主不用VC,debug、release双默认版本的感受不是那么清晰,在VC的设计原则中,debug就是老老实实按照C语句进行汇编的,不做任何优化,无论这种优化有没有副作用(我可以说VC的O1、O2优化都没有副作用,由于VC的优化所直接造成的软件逻辑问题是极少的,那为什么VC不默认就O2呢?)。而且软件情况复杂,编译器又如何判断某种代码就完全不会用到而将及优化掉呢?而且,优化逻辑可能是交叉的或多作用的,优化掉楼主的循环的优化逻辑还可能会有其他动作……最重要的是,debug模式是给人调试的,要的就是完全按照代码明文所确定的逻辑来跑,如果调试的流程和代码所体现的不同,会造成混乱!


debug跟release,除了编译和链接参数的差别,还有没有其它差异呢?
[/Quote]

debug出来的东西比较大,同release相比,里面多了debug的symbol table,
看是用的什么了,gcc 里面不是有 gstabs, swarf2之分么?(这两个名字记不清楚了)
回复
baihacker 2009-11-13
3.4 Name lookup [basic.lookup]
1 The name lookup rules apply uniformly to all names (including typedef-names (7.1.3), namespace-names
(7.3) and class-names (9.1)) wherever the grammar allows such names in the context discussed by a particular
rule. Name lookup associates the use of a name with a declaration (3.1) of that name. Name lookup
shall find an unambiguous declaration for the name (see 10.2). Name lookup may associate more than one
declaration with a name if it finds the name to be a function name; the declarations are said to form a set of
overloaded functions (13.1). Overload resolution (13.3) takes place after name lookup has succeeded. The
access rules (clause 11) are considered only once name lookup and function overload resolution (if applicable)
have succeeded. Only after name lookup, function overload resolution (if applicable) and access
checking have succeeded are the attributes introduced by the name’s declaration used further in expression
processing (clause 5).


这玩意儿确实很复杂,尤其是有模板的时候.
ADL,受限的,非受限的,依赖的,依赖的...乱七八糟的一大堆...
在遇到继承的时候,遇到名字空间的时候...呀...会晕的...

于是就睡觉了.
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告