有趣的处理时间结果

时间:2013-07-15 19:49:25

标签: c++ runtime

我做了一个小应用程序,平均数字在1到1000000之间。不难看出(使用非常基本的代数公式)平均值是500000.5但这更像是学习C ++的项目而不是其他任何项目。

无论如何,我制作了时钟变量,旨在找到运行应用程序所需的时钟步数。当我第一次运行脚本时,它说它花了3770000个时钟步,但每次我从那时起运行它,它花了“0.0”秒......

我在底部附上了我的代码。

要么a。)它是从我第一次运行它时保存变量的,它只是快速运行到答案... 或b。)我如何宣布时间变量有问题。

无论如何......它没有意义。

任何帮助都将不胜感激。

仅供参考(我是通过Linux计算机运行的,不确定这是否重要)

double avg (int arr[], int beg, int end)
{
    int nums = end - beg + 1;

    double sum = 0.0;

    for(int i = beg; i <= end; i++)
    {
        sum += arr[i];
    }   

    //for(int p = 0; p < nums*10000; p ++){}

    return sum/nums;

}

int main (int argc, char *argv[]) 
{ 
    int nums = 1000000;//atoi(argv[0]);
    int myarray[nums];

    double timediff;

    //printf("Arg is: %d\n",argv[0]);
    printf("Nums is: %d\n",nums);

    clock_t begin_time = clock();

    for(int i = 0; i < nums; i++)
    {
        myarray[i] = i+1;
    }

    double average = avg(myarray, 0, nums - 1);

    printf("%f\n",average); 

    clock_t end_time = clock();

    timediff = (double) difftime(end_time, begin_time);

    printf("Time to Average: %f\n", timediff);

    return 0;

}    

2 个答案:

答案 0 :(得分:1)

您正在测量I / O操作(printf),这取决于外部因素并可能影响运行时间。此外,clock()可能不如测量这么小的任务所需的那么精确 - 查看更高分辨率的函数,如clock_get_time()。即使这样,其他过程也可能通过产生页面故障中断和占用内存总线等来影响运行时间。所以这种波动完全没有异常。

答案 1 :(得分:0)

On the machine I tested,Linux的clock来电仅准确到1/100秒。如果您的代码运行时间不到0.01秒,通常会说零秒已经过去。另外,我在.13秒内总共运行了50次程序,因此我发现您声称在计算机上运行一次需要2秒钟才可疑。

您的代码错误地使用了difftime,如果时钟表示时间已过,则可能会显示错误的输出。

我猜你得到的第一个时间是使用与此问题中发布的代码不同的代码,因为我无法想到这个问题中的代码会产生3770000的时间。

最后,基准测试很难,而且您的代码存在一些基准测试错误:

  • 你计算(1)填充数组需要多长时间,(2)计算平均值,(3)格式结果字符串(4)进行OS调用(慢),在右边打印所述字符串language / font / colo / etc,这特别慢。
  • 你正在尝试计算一项不到百分之一秒的任务,这对任何准确的测量而言都太小了。

Here is my take on your code, measuring that the average takes ~0.001968 seconds on this machine

相关问题