| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2378 人关注过本帖
标题:[原创]宏比函数实现在时间上的优越性探讨.
只看楼主 加入收藏
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
结帖率:100%
收藏
 问题点数:0 回复次数:8 
[原创]宏比函数实现在时间上的优越性探讨.

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: neverTheSame E-mail:zhaoxufeng9997@126.com QQ:475818502
*/ 时间: 2007-11-1 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


在某些程序设计中,有些方法可以用函数来实现也可以用宏定义来实现.
一般来说用宏定义的方法在时间上占有相当大的优势,在空间上有时也占一定的优势.
这是因为函数在调用时,需要保护现场和恢复现场,所进行的压栈和出栈操作.
此外,函数在调用时要形参分配临时空间,还要对实参和形参的传递等处理.
而宏在程序中只是将它展开直接插入到程序段中,因此不需要像函数调用那样.
因此宏定义节约了一定的CPU处理时间.
下面给出二个例子,就能更形象说明问题了.
例子一:用函数实现.
#include<time.h>
int GETMAX(int x,int y,int z)
{
return (x>=y?x:y)>z?(x>y?x:y):z;
}
int tGETMAX(int x,int y,int z,int m,int n,int p)
{
return GETMAX(x,y,z)>=GETMAX(m,n,p)?GETMAX(x,y,z):GETMAX(m,n,p);
}
int main(void)
{
time_t start,end;
long i;
clrscr();
start=clock();
for(i=0;i<10000000;i++)
tGETMAX(1,2,3,4,5,6);
end=clock();
printf("%lf",(double)(end-start)/CLK_TCK);
getch();
}
执行时间:1.373626秒
可执行文件大小:29,938字节

例子二:用宏实现.
#include<stdio.h>
#include<conio.h>
#include<time.h>
#define GETMAX(X,Y,Z) ((X>=Y?X:Y)>=Z?(X>Y?X:Y):Z)
#define tGETMAX(X,Y,Z,M,N,P) \ /*由于一行不好写,所以将其写到第二行,但要加一个'\'作标记*/
(GETMAX(X,Y,Z)>=GETMAX(M,N,P)?GETMAX(X,Y,Z):GETMAX(M,N,P))
int main(void)
{
time_t start,end;
long i;
clrscr();
start=clock();
for(i=0;i<10000000;i++)
tGETMAX(1,2,3,4,5,6);
end=clock();
printf("%lf",(double)(end-start)/CLK_TCK);
getch();
}
执行时间:0.054945秒
可执行文件大小:29,497字节

由于上面二个例子可见:在时间上1.373626秒与0.054945秒之间的差值.
在空间上29,938字节与29,497字节之间的差值.

这里需要注意的是,使用宏来实现在空间上的优势只当宏使用得很少.
但当宏使用得多空间效率就没有用函数来实现的好.
(以上程序在TC2.0下实现)

搜索更多相关主题的帖子: 优越性 函数 探讨 时间 
2007-11-01 02:19
zzjking
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-7-16
收藏
得分:0 
用宏定义时~不用管返回值吗?看函数定义那里有返回值说明~
其实感觉没啥区别~要是函数比较大的时候,还是要单写~
简单的计算啥的用宏写还可以~

2007-11-01 09:00
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 

不比不知道,30倍啊


从BFS(Breadth First Study)到DFS(Depth First Study)
2007-11-01 09:28
学c
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2007-9-17
收藏
得分:0 
(end-start)/CLK_TCK楼主介绍一下这个是什么意思啊?为什么要除一个clk_tck呀?其实我感觉宏和内联函数道理上是类似的,但是宏不如内联函数好,因为宏是在预编译阶段进行的字符替换替换而不进行语法检查,而内联函数是在编译阶段进行处理的要进行语法检查。哪位高手讲一下函数调用和返回的过程啊,我想知道时间都浪费到哪里去了。我只知道什么保护现场之类的一些东东。。
2007-11-01 10:13
万兽无缰
Rank: 1
等 级:新手上路
威 望:1
帖 子:296
专家分:0
注 册:2007-8-27
收藏
得分:0 

时间上的优势很可观啊


女朋友问我想怎么死~~~
             我说我想"爽死"
2007-11-01 10:20
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
以下是引用学c在2007-11-1 10:13:45的发言:
(end-start)/CLK_TCK楼主介绍一下这个是什么意思啊?为什么要除一个clk_tck呀?其实我感觉宏和内联函数道理上是类似的,但是宏不如内联函数好,因为宏是在预编译阶段进行的字符替换替换而不进行语法检查,而内联函数是在编译阶段进行处理的要进行语法检查。哪位高手讲一下函数调用和返回的过程啊,我想知道时间都浪费到哪里去了。我只知道什么保护现场之类的一些东东。。

clock()函数的作用是得到从程序运行到当前所经历的时钟周期.
(end-start)就是代码所花的时钟周期.
CLK_TCK为1秒钟有多少个时钟周期.
然后(end-start)/CLK_TCK就是多少秒了.

函数调用需要保护/恢复现场,指令跳转,
变量的数据写入读取(而宏中的数据就是指令的一部分,不需要写入读取.这可能是宏最主要的优势.)


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-11-02 00:04
学c
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2007-9-17
收藏
得分:0 
2007-11-02 12:40
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
难道楼主写宏的时候都不给参数加括号的吗?

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-11-02 23:53
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 

谢谢楼上提醒.
在定义宏的时侯的确要有括号,这样会避免很多麻烦.

[此贴子已经被作者于2007-11-6 13:55:23编辑过]


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-11-03 00:01
快速回复:[原创]宏比函数实现在时间上的优越性探讨.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059752 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved