写的那个界面显示程序里有个复位的过程,也就是把相关的数据清0,当时用的是memset,忽然一想,这函数的开销怎么样,跟直接赋值,哪个效率更高?网上搜了个程序,改了改,the code:
#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<string.h>
void use_memset(int *buff)
{
int i=0;
struct timeval timestart,timeend;
gettimeofday(×tart, NULL);
memset(buff,1,4*100);
gettimeofday(&timeend, NULL);
double linStart = 0,linEnd = 0;
linStart = ((double)timestart.tv_sec * 1000000 + (double)timestart.tv_usec); //unit S
linEnd = ((double)timeend.tv_sec * 1000000 + (double)timeend.tv_usec); //unit S
double time = linEnd-linStart;
printf("%f/n",time);
}
void use_array(int* buff)
{
int i,j;
struct timeval timestart,timeend;
gettimeofday(×tart, NULL);
for( i = 0; i < 100; i ++)
buff[i]=1;
gettimeofday(&timeend, NULL);
double linStart = 0,linEnd = 0;
linStart = ((double)timestart.tv_sec * 1000000 + (double)timestart.tv_usec); //unit S
linEnd = ((double)timeend.tv_sec * 1000000 + (double)timeend.tv_usec); //unit S
double time = linEnd-linStart;
printf("%f/n",time);
}
int main(int argc, char** argv)
{
int buf[100];
int *buf1=(int *)malloc(sizeof buf);
printf("in heap:/n");
use_memset(buf1);
use_array(buf1);
printf("in stack:/n");
use_memset(buf);
use_array(buf);
printf("/nover/n");
}
运行结果
in heap:
6.000000
3.000000
in stack:
2.000000
3.000000
ove
如果把数组大小改为1024
in heap:
5.000000
9.000000
in stack:
2.000000
5.000000
over
memset的优势就显现出来了,尽管是那么的。。。。
如果把数组改为1024*1024in heap:
2999.000000
4812.000000
in stack:
3558.000000
6627.000000
over
可见memset比赋值基本快一倍。
数据量比较小时赋值快
还有对stack和heap的赋值时间也不一样,这是为什么?
程序还有不完善的地方,没有考虑其他进程的抢占,ok,后面是设置进程实时的代码:
#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<string.h>
#include<sched.h>
#include<sys/types.h>
#include<unistd.h>
void use_memset(int *buff)
{
int i=0;
struct timeval timestart,timeend;
gettimeofday(×tart, NULL);
memset(buff,1,4*1024*1024);
gettimeofday(&timeend, NULL);
double linStart = 0,linEnd = 0;
linStart = ((double)timestart.tv_sec * 1000000 + (double)timestart.tv_usec); //unit S
linEnd = ((double)timeend.tv_sec * 1000000 + (double)timeend.tv_usec); //unit S
double time = linEnd-linStart;
printf("%f/n",time);
}
void use_array(int* buff)
{
int i,j;
struct timeval timestart,timeend;
gettimeofday(×tart, NULL);
for( i = 0; i < 1024*1024; i ++)
buff[i]=1;
gettimeofday(&timeend, NULL);
double linStart = 0,linEnd = 0;
linStart = ((double)timestart.tv_sec * 1000000 + (double)timestart.tv_usec); //unit S
linEnd = ((double)timeend.tv_sec * 1000000 + (double)timeend.tv_usec); //unit S
double time = linEnd-linStart;
printf("%f/n",time);
}
int main(int argc, char** argv)
{
int buf[1024*1024];
int *buf1=(int *)malloc(sizeof buf);
if(getuid()!=0){
perror("getuid");
return -2;
}
struct sched_param param;
param.sched_priority=20;
if(sched_setscheduler(0,SCHED_FIFO,¶m)!=0){
perror("shed_error");
return -1;
}
printf("in heap:/n");
use_memset(buf1);
use_array(buf1);
printf("in stack:/n");
use_memset(buf);
use_array(buf);
printf("/nover/n");
}
in heap:
3064.000000
4757.000000
in stack:
3830.000000
4750.000000
over
in heap:
8796.000000
15562.000000
in stack:
8660.000000
15437.000000
over
这两组数据 波动为什么这么大??实时进程后,时间怎么不减反增??哪位能解释下?
至于椎栈的差别到没有了。看来是调度的问题。