我有以下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));
}
答案 0 :(得分:7)
您的格式字符串需要int
(%d
)和double
(%f
)。您的论点是long long
和double
。您应该将第一个格式字符串设置为%lld
。
当在堆栈上推送参数以调用printf
时,使用8个字节推送long long
,使用8个字节推送double
。当函数printf
读取格式字符串时,它首先要求4个字节为int
,而8个字节为double
。 printf
正确地获取int
,因为您是小端,而long long
的前四个字节足以表示该值。然后printf
获取double
,它获取long long
的最后四个字节,然后是double
的前四个字节。由于long long
的最后四个字节是零,printf
认为是一个双开始,四个字节值为零,因此double
的值非常小。双打的二进制表示。
答案 1 :(得分:2)
答案 2 :(得分:1)
制作临时volatile
,使其无法优化。编译器可能将其视为没有副作用的部分/函数。
答案 3 :(得分:0)
它计算time1和time2之间的秒数差异。那么也许你的时差不到1秒?
输出您的开始和结束时间以进行验证。
答案 4 :(得分:0)
time()返回time_t,其分辨率为1秒。
runDivision()所需的时间不到一秒;在多GHz核心上进行10亿次操作只需不到一秒钟。