C寄存器变量、局部静态变量、自动变量效率对比
来源:互联网 发布:法国经济知乎 编辑:程序博客网 时间:2024/05/29 12:49
总共有auto,static,register,extern
C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高效率。
对于register变量需要注意的几点:
一直想测试一下寄存器变量和自动变量的效率问题,很多人都说寄存器变量一般现在都是由编译器自动优化的,没看到网上有关于这个测试程序,所以想自己写程序看下linux下gcc用和不用寄存器变量有什么差别。恰好又看到局部静态变量的问题,三者放到一起做了个简单对比。
我们做个简单的加法:
输入一个长整型数k,计算s=-k+(-k+1)+...+0+1+...+(k-1)+k的值,使用for循环直接加。
当然,为了防止溢出,s为长长整型。(省事,其实要是用s=(-k+k)+(-k+1+k-1)+...+(-1+1)+0来算是可以不用长长整型的)
结果显示:
寄存器变量比用静态局部变量约快一倍,比用自动变量约快两倍。
(我的系统是Ubuntu10.04 amd64,gcc版本4.4.3。)
k=10000000000,也就是10^10时
得到结果:
10000000000
Using r: -10000000000+(-10000000000+1)+...+0+1+...+10000000000=0
Using r take 27.260935 second
Using s: -10000000000+(-10000000000+1)+...+0+1+...+10000000000=0
Using s take 61.445107 second
Using n: -10000000000+(-10000000000+1)+...+0+1+...+10000000000=0
Using n take 81.149198 second
k=100000,也就是10^5时
得到结果:
100000
Using r: -100000+(-100000+1)+...+0+1+...+100000=0
Using r take 0.000621 second
Using s: -100000+(-100000+1)+...+0+1+...+100000=0
Using s take 0.001172 second
Using n: -100000+(-100000+1)+...+0+1+...+100000=0
Using n take 0.001877 secoond
另:
我最开始用递归的方法来做这个事,然后发现寄存器变量用的时间反而是最长的,估计可能是每次分配时都要给寄存器变量分配空间,实际上分配到的很快就是内存了。
用g++编译的,寄存器变量效率比用gcc要略低点(20%左右),但是使用其它两种变量都要比用gcc高点(30%)。
似乎gcc对自动变量优化做得很少?还是需要手工设置编译参数优化?
源程序:
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
long long add_reg(long);
long long add_sta(long);
long long add_nor(long);
long cal_time(long,char);
int main()
{
long long s;
long n;
char method;
scanf("%ld",&n);
method='r';
s=cal_time(n,method);
method='s';
s=cal_time(n,method);
method='n';
s=cal_time(n,method);
}
long cal_time(long n,char method)
{
struct timeval start,end;
double tc;
long long s;
//记录开始时间(recording start time)
gettimeofday( &start, NULL );
switch(method)
{
case 'r':
s=add_reg(n); //使用寄存器
break;
case 's':
s=add_sta(n); //使用局部静态变量
break;
case 'n':
s=add_nor(n); //使用一般的自动变量
break;
default:
printf("Wrong method.");
}
//记录结束时间(recording end time)
gettimeofday( &end, NULL );
//显示计算的时间(display caculation time using cpu)
tc = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
tc /= 1000000;
printf("Using %c: -%ld+(-%ld+1)+...+0+1+...+%ld=%lld\n",method,n,n,n,s);
printf("Using %c take %f second\n\n",method,tc);
return s;
}
long long add_reg(long k)
{
register long i=0;
register long long s=0;
for(i=-k;i<=k;i++)s=s+i;
return s;
}
long long add_sta(long k)
{
static long i;
static long long s=0;
for(i=-k;i<=k;i++)s=s+i;
return s;
}
long long add_nor(long k)
{
long i;
long long s=0;
for(i=-k;i<=k;i++)s=s+i;
return s;
}
- C寄存器变量、局部静态变量、自动变量效率对比
- 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- c语言中的变量(局部变量,外部变量,静态变量,寄存器变量) .
- 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- C语言中----局部变量,外部变量,静态变量,寄存器变量
- [C++] 静态局部变量
- 自动变量、静态变量、全局变量、寄存器变量、易失变量
- 16.变量类型 自动变量 静态变量 寄存器变量
- 成员变量、局部变量与静态变量对比
- 静态变量、自动变量与寄存器变量的存储
- 分析:全局变量,局部变量,自动变量,静态变量
- C/C++局部静态变量
- [zt] 全局变量、静态全局变量、静态局部变量和局部变量,寄存器变量的区别
- C语言的中的静态变量和局部变量(自动变量)
- C-全局变量,局部变量,静态全局变量,静态局部变量
- C++,全局变量,局部变量,静态全局变量,静态局部变量
- Android 解决程序启动时的黑屏问题
- URL汉字编码问题(及乱码解决)
- 两个单片机小项目(一)
- 微软笔试面试题集锦 --留着自己慢慢研究啊
- 求二叉树中节点的最大距离
- C寄存器变量、局部静态变量、自动变量效率对比
- AIX系统添加打印机,(ERP添加打印机)
- 主键生成策略
- sqlserver总结
- Android截屏
- JavaScript URL汉字编码转换
- Python 代码性能优化技巧
- 查看系统CPU,内存等使用情况
- Qt :添加动作