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

时间:2010-10-28 09:34:55

标签: c

我有以下C99程序,它测量相对于加法的简单除法运算的性能。但是,difftime函数保持返回0,即使程序显然需要几秒钟来处理runAdditionrunDivision并将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 个答案:

答案 0 :(得分:7)

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

当在堆栈上推送参数以调用printf时,使用8个字节推送long long,使用8个字节推送double。当函数printf读取格式字符串时,它首先要求4个字节为int,而8个字节为doubleprintf正确地获取int,因为您是小端,而long long的前四个字节足以表示该值。然后printf获取double,它获取long long的最后四个字节,然后是double的前四个字节。由于long long的最后四个字节是零,printf认为是一个双开始,四个字节值为零,因此double的值非常小。双打的二进制表示。

答案 1 :(得分:2)

尝试使用%lld代替%d中的printf

printf("%lld additions t
         ^^^

Works fine after this change.

答案 2 :(得分:1)

制作临时volatile,使其无法优化。编译器可能将其视为没有副作用的部分/函数。

答案 3 :(得分:0)

它计算time1和time2之间的秒数差异。那么也许你的时差不到1秒?

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

答案 4 :(得分:0)

time()返回time_t,其分辨率为1秒。

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