代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

当有明显差异时,DiffTime返回0

c
  •  4
  • Jake Petroules  · 技术社区  · 14 年前

    我有下面的C99程序,它测量简单除法运算相对于加法的性能。然而, difftime 函数继续返回0,即使程序显然需要几秒钟来处理 runAddition runDivision 具有 iterations 设为10亿。

    #include <stdio.h>
    #include <time.h>
    
    void runAddition(long long iterations)
    {
        long long temp;
        for (long long i = 1; i <= iterations; i++)
        {
            temp = temp + i;
        }
    }
    
    void runDivision(long long iterations)
    {
        long long temp;
    
        // Start at 1 to avoid division by 0!
        for (long long i = 1; i <= iterations; i++)
        {
            temp = temp / i;
        }
    }
    
    int main()
    {
        long long iterations = 1000000000;
        time_t startTime;
    
        printf("How many iterations would you like to run of each operation? ");
        scanf("%d", &iterations);
    
        printf("Running %d additions...\n", iterations);
        startTime = time(NULL);
        runAddition(iterations);
        printf("%d additions took %f seconds\n", iterations, difftime(time(NULL), startTime));
    
        printf("Running %d divisions...\n", iterations);
        startTime = time(NULL);
        runDivision(iterations);
        printf("%d divisions took %f seconds\n", iterations, difftime(time(NULL), startTime));
    }
    
    5 回复  |  直到 14 年前
        1
  •  7
  •   Didier Trosset    14 年前

    您的格式字符串需要 int ( %d )和 double ( %f )你的论点是 long long 双重的 . 您应该将第一个格式字符串设置为 %lld .

    在堆栈上推送参数以调用时 printf 你推一个 长长 使用8字节,和 双重的 也使用8字节。当函数 普林特 读取格式字符串,它应首先 int 在4个字节上,和 双重的 8字节。 普林特 得到 int 正确地说,因为您是小endian和 长长 足以表示该值。 普林特 然后得到 双重的 它得到了 长长 ,后跟 双重的 . 作为 长长 是零,什么? 普林特 think是一个以值为零的四个字节开头的双精度数,结果是 双重的 根据双精度数的二进制表示。

        2
  •  2
  •   codaddict    14 年前

    试用使用 %lld 代替 %d printf :

    printf("%lld additions t
             ^^^
    

    Works fine after this change.

        3
  •  1
  •   leppie    14 年前

    使温度升高 volatile 所以它不会被优化掉。编译器可能将其视为一个没有副作用的节/函数。

        4
  •  0
  •   Sheen    14 年前

    它计算时间1和时间2之间的秒数差。所以也许你的时差小于1秒?

    输出开始和结束时间进行验证。

        5
  •  0
  •   user82238    14 年前

    time()返回一个时间,其分辨率为1秒。

    rundivision()所需的时间不到一秒钟;在多GHz核心上进行10亿次操作所需的时间不到一秒钟。