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

Jak*_*les 4 c

我有以下C99程序,它测量相对于加法的简单除法运算的性能.然而,difftime功能保持返回0,即使该程序显然是采取一些秒来处理runAddition,并runDivisioniterations设置为1十亿.

#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));
}
Run Code Online (Sandbox Code Playgroud)

Did*_*set 7

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

当在栈上调用参数进行调用时printf,long long使用8个字节推送a,使用8个double字节.当函数printf读取格式字符串时,它首先需要int4个字节,double8个字节.printf得到int正确的,因为你是little-endian,你的前四个字节long long足以表示值.printf然后获取double它获取的最后四个字节long long,然后是前四个字节double.由于最后四个字节long long是零,所以printf认为是一个双开始的四个字节值为零,double根据双精度的二进制表示产生非常小的值.