我编写了以下代码来测量排序任何数据的时间。我得到了奇怪的结果,比如在某些情况下的负时间,并且没有得到相同数据集的任何一致结果(我知道它不会完全相同)。请让我知道什么是错的,或者我如何正确地测量时间。
#include<stdio.h>
#include<sys/time.h>
void bubble(int a[],int n)
{
int i,j,flag,temp;
for(i=0;i<n-1;i++)
{
flag=0;
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
flag=1;
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
if(flag==0)
break;
}
}
int main()
{
int n,a[100000],i;
printf("Enter the size of array:");
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=rand()%100000; //average case
//a[i]=i; //best case
//a[i]=n-1-i; //worst case
/*
printf("The UNsorted array is:\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n\n");
*/
int st,et;
struct timezone tz;
struct timeval tv;
gettimeofday(&tv,NULL);
st=tv.tv_usec;
bubble(a,n);
gettimeofday(&tv,NULL);
et=tv.tv_usec;
printf("Sorting time: %d micro seconds\n",et-st);
/*
printf("\nThe sorted array is:\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
*/
return 0;
}
答案 0 :(得分:5)
struct timeval
填充的gettimeofday
定义如下:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
tv_sec
和tv_usec
字段在一起包含自纪元以来的秒和微秒。微秒部分仅包含小数秒,即0到999999之间的值。
您需要减去秒和微秒。
struct timeval st, et;
gettimeofday(&st,NULL);
bubble(a,n);
gettimeofday(&et,NULL);
int elapsed = ((et.tv_sec - st.tv_sec) * 1000000) + (et.tv_usec - st.tv_usec)
printf("Sorting time: %d micro seconds\n",elapsed);
如果总运行时间非常短,您可以执行多次运行并将其平均化:
struct timeval st, et;
int i, num_runs = 5;
gettimeofday(&st,NULL);
for (i=0; i<num_runs; i++) {
bubble(a,n);
}
gettimeofday(&et,NULL);
int elapsed = (((et.tv_sec - st.tv_sec) * 1000000) + (et.tv_usec - st.tv_usec)) / num_runs;