我有以下C99程序,它测量相对于加法的简单除法运算的性能.然而,difftime功能保持返回0,即使该程序显然是采取一些秒来处理runAddition,并runDivision与iterations设置为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)
您的格式字符串需要a int(%d)和a double(%f).你的论点是long long和double.您应该将第一个格式字符串设置为%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根据双精度的二进制表示产生非常小的值.