一个内联函数的效率问题

wxy232 2001-07-21 10:16:49
加精
一个测评内联函数效率的源程序如下:
#include<iostream.h>
#include<time.h>
inline int comp1(int a, int b){return (a>b)?a:b;}
int comp2(int a, int b){return (a>b)?a:b;}

void main()
{
double t1,t2;
int m=0,n=0;
t1=(double)clock();
for(m=0;m<10000;m++)
for(n=0;n<10000;n++)
comp1(m,n);
t2=(double)clock();
cout<<"调用内联函数运行时间为:\t"<<(t2-t1)/CLK_TCK<<"s\n";

m=0;n=0;
t1=(double)clock();
for(m=0;m<10000;m++)
for(n=0;n<10000;n++)
comp2(m,n);
t2=(double)clock();
cout<<"调用外部函数运行时间为:\t"<<(t2-t1)/CLK_TCK<<"s\n";

m=0;n=0;
t1=(double)clock();
for(m=0;m<10000;m++)
for(n=0;n<10000;n++)
(m>n)?m:n;
t2=(double)clock();
cout<<"直接运行时间为:\t"<<(t2-t1)/CLK_TCK<<"s\n";
}

这是第一次运行的结果:
调用内联函数运行时间为: 5.27s
调用外部函数运行时间为: 6.15s
直接运行时间为: 2.91s

第二次:
调用内联函数运行时间为: 4.89s
调用外部函数运行时间为: 4.89s
直接运行时间为: 2.47s

第三次:
调用内联函数运行时间为: 4.89s
调用外部函数运行时间为: 4.78s
直接运行时间为: 2.47s

为什么一次比一次怪?运行环境vc6 dos_link模式。
...全文
122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
glassshark 2001-12-27
  • 打赏
  • 举报
回复
我个人认为(不一定正确),有一条规则说到:对于内联函数来说,只在较小或可以的情况下才进行代码内嵌(类似于宏扩展),如果函数过大或者在循环中,编译器将不实现INLINE,也就是说在优化过程中,如果循环不能被替代,inline是不能实现的,而且inline的实现权在编译器,并不由程序员全权决定,该关键字只代表程序员的建议,对编译器没有强制约力。
wxy232 2001-07-24
  • 打赏
  • 举报
回复
谢谢ahao的热情帮助,果然是要加上参数。同时也要谢谢zzh、lijunjoy的回帖。
同时我还有一点不明白的是为什么CL要有这么一个参数来控制内联函数的展开,既然是
内联函数就应该在编译时展开,CL加上这么一个参数有什么含义?
附:
用 cl /Ob2 x.cpp 命令编译运行后的结果:
调用内联函数运行时间为: 2.97s
调用外部函数运行时间为: 4.39s
直接运行时间为: 2.09s

ahao 2001-07-23
  • 打赏
  • 举报
回复
inline 默认不展开.
用 cl /Ob2 xx.cpp
wxy232 2001-07-23
  • 打赏
  • 举报
回复
就是在MS-DOS窗口中直接调用CL.EXE来编译源程序,而没有用VC6的整合环境。
ahao 2001-07-23
  • 打赏
  • 举报
回复
什么叫dos_link模式
wxy232 2001-07-23
  • 打赏
  • 举报
回复
我用的是DOS_LINK方式编译的,代码应该没有被优化吧。
ahao 2001-07-22
  • 打赏
  • 举报
回复
而且你的例子不能说明问题,代码都给优化掉了
ahao 2001-07-21
  • 打赏
  • 举报
回复
呵,debug版,inline不起作用,你换release再看看
wxy232 2001-07-21
  • 打赏
  • 举报
回复
谢谢zzh()的提醒,我又反复试了很多次(别的程序都关了),为什么怎是内联函数比外部函数
运行时间还长,按道理,程序在编译后内联函数应该和直接运行时间差不多。
另外我把循环开大差距也不明显,按我的理解内联函数的运行时间应该和直接运行时间差不多,
但现在的运行结果差值却比较大。
zzh 2001-07-21
  • 打赏
  • 举报
回复
首先你这样测试的环境就不准确,你这个时间其实是有区别的,因为,现在的时间都很短,所以很难发现之间的区别
而且,系统运行环境也有区别,如果你在测试时,还干了别的事情,就又不一样了
你可以把循环再开大一点,再比较一下几次测试时间的差值,如果差值比较小的话,就可以了
wxy232 2001-07-21
  • 打赏
  • 举报
回复
望赐教?谢谢。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧