【问题标题】:time difference is zero sec时差为零秒
【发布时间】:2016-04-25 23:32:30
【问题描述】:

在这里我试图计算完成合并排序所需的时间。但是开始和结束之间的差异显示为零秒。我不知道是什么问题。为方便起见,我只发布主要功能计算时间。

#include<stdio.h>
#include<time.h>
int main(){
    clock_t start,end,diff;
    start=clock();
    int arr[4]={12,2,56,1};
    int i;
    printf("beforn sort\n");
    printf("\n-------------\n");
    for(i=0;i<4;i++){
        printf("%d ",arr[i]);
    }
    printf("\n \n");
    Merge_sort(arr,0,3);
    printf("after merge sort\n");
    printf("\n-------------\n");
    for(i=0;i<4;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    end=clock();
    diff=(double)(end-start)/CLOCKS_PER_SEC;
    printf("total time is %f sec ",diff);
}

【问题讨论】:

  • 也许不到一秒
  • 更重要的是,也许它花费的时间少于时钟的分辨率。对 4 元素数组进行合并排序将非常快
  • 除非处理器非常慢...
  • 更重要的是,如果clock_t 是一个整数类型,printf("total time is %f sec ",diff); 是未定义的行为,因为它会将错误的类型传递给printf("%f")
  • diff的类型改成double怎么样?

标签: c time


【解决方案1】:

clock() 返回程序启动后经过的时钟滴答数。这样

start=clock();

给出从程序启动到调用clock() 的时钟滴答数。 这会在排序之前为您提供时钟滴答。这是时钟滴答数,而不是秒数。

排序后

end=clock()

给出从程序启动到调用clock() 的时钟滴答数。 这会在排序后为您提供时钟滴答。这是时钟滴答数,而不是秒数。

现在end-start 给出排序过程中的时钟滴答数。(这也不是以秒为单位)

(时钟滴答数)/(一秒内时钟滴答数)= 时间(秒)

(end-start)/CLOCKS_PER_SEC 以秒为单位给出排序过程所需的时间。但在 C 中,这给出了一个整数。所以它必须被类型转换为双精度。这给了。

double diff;
diff=(double)(end-start)/CLOCKS_PER_SEC;

【讨论】:

    【解决方案2】:

    CLOCKS_PER_SEC 被定义为 clock_t 类型,在 N1256 7.23.1 中被定义为算术类型。提示clock_t可能是整数类型。

    我想您应该将diff 的类型更改为double。这样做也会使最后一次使用 printf() 正确。

    【讨论】:

    • 谢谢,它有效!为什么除以 CLOCK_Per_SECOND 给我的时间是 sec...这很令人困惑。我知道这是另一个问题,但你能回答一下吗?
    • 维度分析将揭示您的新问题的答案。
    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 2021-10-05
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多