鱼C论坛

 找回密码
 立即注册
查看: 2811|回复: 6

小甲鱼C语言第39讲视频中关于register变量的效率问题

[复制链接]
发表于 2013-11-23 17:30:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在这一章中,小甲鱼说register能提高运行效率并且给我们演示了添加register程序后运行有多么多么快。但是我在自己试验的时候却没有发现。我给程序加了一个计算程序运行时间的函数。然后。。。请看代码。
//这是小甲鱼39课时给我们演示了一个实例程序。
#include <stdio.h>
#include <time.h>
double fac(double n)
{
double i,f=1;
//register double i,f=1;
for (i=1;i<=n;i++)
{
f*=i;
}
return f;
}
void main()
{
clock_t start, finish; 
double duration; 
//测量一个事件持续的时间 
start = clock(); 
double i; 
for (i=1;i<=35;i++)
{
printf("%lf!=%lf\n",i,fac(i));
}
finish = clock(); 
duration = (double)(finish - start) / CLOCKS_PER_SEC; 
printf( "%f seconds\n", duration ); 
}
#include <stdio.h>
#include <time.h>
void main()
{ 
clock_t start, finish; 
double duration; 
//测量一个事件持续的时间 
start = clock(); 
register double j=0;
//double j=0;
while (j!=5000000000)//这个已经是加了50E次了。
{
j++;
}
printf("j=%lf\n",j);
finish = clock(); 
duration = (double)(finish - start) / CLOCKS_PER_SEC; 
printf( "%f seconds\n", duration ); 
}
//没有register和有register是一样的。都用时21.812秒。
由此我得出的结论是:1,书中所说的运行效率可能不是程序运行时间。
                                   2,如果是减少运行时间的话,那么小甲鱼视频给的程序可能并不合适。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-23 17:36:05 | 显示全部楼层
补充说明 小甲鱼那个程序在我的电脑上, 有没有register,时间都为0.000000秒 根本看不出如视频所说的时间差异。也就是说小甲鱼演示的是不是所看出的时间差,并不是真正的程序运行时间差!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-23 17:55:24 | 显示全部楼层
你应该在release版本下试验。debug版本的register请求全部都会被拒绝。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-23 18:21:25 | 显示全部楼层

谢谢版主的提醒! 于是我又测试了一下。结果如下。。
貌似release版本加不加register都是循环50E次后是8.328000秒与8.343000秒
而debug版本加不加register也都是循环50E次后是21.781000秒与21.765000秒
看来版本间确实有差异,但是同一个版本下有没有register运行时间貌似是一样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-23 21:04:38 | 显示全部楼层
E=MC2 发表于 2013-11-23 18:21
谢谢版主的提醒! 于是我又测试了一下。结果如下。。
貌似release版本加不加register都是循环50E次后是8 ...

我实验了一下,并比较了C语言生成的对应汇编代码,得到的结论是VC6的编译器在任何优化措施下都会直接忽略register关键字。也就是说,对于哪些变量要放在寄存器,哪些放在存储器,现代的C语言编译器都有自己的一套套路,所以忽视程序员的认为指定(也许像turbo c这样的老编译器会接受用户的指定吧。)
感谢LZ提出的问题,我之前也没注意到这个问题。其实,我觉得像register这些特性本来就应该由编译器自己实施,但由于之前的编译器不成熟,所以把本该编译器做的事情强加给程序员做,现在随着编译器的智能化,编译器终于接手了像register这些它本来就应该接手的特性。
BTW,LZ之前的理解是对的,书中说的运行效率就是运行时间。由于这段基本上大家都是直接抄权威教材(权威教材又是针对很久以前的C编译器),所很多书以这里说得都有点问题,不过书上说register仅仅是“建议编译器”怎么怎么做,倒是没有错的,只不过很多现代编译器不管这些建议罢了(因为编译器自己的判断往往比程序员更准确)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-23 21:25:50 | 显示全部楼层
仰望天上的光 发表于 2013-11-23 21:04
我实验了一下,并比较了C语言生成的对应汇编代码,得到的结论是VC6的编译器在任何优化措施下都会直接忽略 ...

3Q 明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-23 21:26:07 | 显示全部楼层
我爱鱼C ο(^_^)ο
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表