计算时间差使用 difftime 这个函数。为什么不直接使用 time_t 类型的时间戳做差呢?因为我们前面提到过尽管多数系统都将 time_t 实现成了单位为秒的时间戳,但 C 标准并没有做出这个规定,因此如果你想要计算时间差,最稳妥的办法就是使用 difftime,它的原型如下
    double difftime( time_t time_end, time_t time_beg );
    用例也很简单,我们定义一个函数 DoHardWork,在其中做非常多的运算,然后在调用前和调用后分别获取当前时间,使用 difftime 来计算时间过去了多久:

    1. time_t start_time = time(NULL);
    2. double result = DoHardWork();
    3. PRINT_DOUBLE(result);
    4. time_t end_time = time(NULL);
    5. double time_passed = difftime(end_time, start_time);
    6. PRINT_LONG(start_time);
    7. PRINT_LONG(end_time);
    8. PRINT_DOUBLE(time_passed);

    相比之下,这里与我们使用处理器时间来计算程序运行的耗时有细微的差别,处理器时间体现了程序的实际运算量,而这个例子反应的是程序运行耗时给用户的实际感受。
    clock_t 描述的就是处理器在执行程序过程中所消耗的时间,它与我们通常所谓的时间不是相同的概念,因为处理器可能会在某一段时间内被其他程序占用,或者会同时有多个处理器执行当前程序,因此处理器时间通常只是用作程序执行时间的计算。
    使用 clock 函数可以获取当前程序已经消耗的处理器时间,clock 函数的原型如下:
    clock_t clock(void);
    我们给出用例:

    1. #define PI 3.1415926
    2. clock_t clock_start = clock();
    3. double sum = 0;
    4. for (int i = 0; i < 10000000; ++i) {
    5. sum += i * i / PI;
    6. }
    7. PRINT_DOUBLE(sum);
    8. clock_t clock_end = clock();
    9. PRINTLNF("Consumed clocks: %ld", clock_end - clock_start);
    10. PRINTLNF("Consumed clocks as seconds: %f", (clock_end - clock_start) * 1.0f / CLOCKS_PER_SEC);

    我们给出的例子当中的运算本身没有任何实际的含义,只是为了演示使用 clock 来跟踪运算耗时的方法。统计程序运行耗时通常在程序算法性能优化时会用来衡量程序优化的实际效果。
    程序输出:

    1. sum: 5.49007e+012
    2. Consumed clocks: 65
    3. Consumed clocks as seconds: 0.065000


    1. #include <io_utils.h>
    2. #include <time_utils.h>
    3. #include <time.h>
    4. #define PI 3.1415926
    5. void DoHardWork() {
    6. double sum = 0;
    7. for (int i = 0; i < 10000000; ++i) {
    8. sum += i * i / PI;
    9. }
    10. PRINT_DOUBLE(sum);
    11. }
    12. int main() {
    13. time_t start_time = time(NULL);
    14. DoHardWork();
    15. time_t end_time = time(NULL);
    16. double diff = difftime(start_time, end_time);
    17. PRINT_DOUBLE(diff);
    18. long_time_t start_time_ms = TimeInMillisecond();
    19. DoHardWork();
    20. long_time_t end_time_ms = TimeInMillisecond();
    21. PRINT_LLONG(end_time_ms - start_time_ms);
    22. clock_t start_time_c = clock();
    23. DoHardWork();
    24. clock_t end_time_c = clock();
    25. PRINT_DOUBLE((end_time_c - start_time_c) * 1.0 / CLOCKS_PER_SEC);
    26. return 0;
    27. }