我有以下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));
}发布于 2010-10-28 17:45:47
格式字符串需要一个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的值非常非常小。
发布于 2010-10-28 17:48:57
尝试在printf中使用%lld代替%d
printf("%lld additions t
^^^发布于 2010-10-28 17:42:32
将temp设为volatile,这样它就不会被优化。编译器可能会将其视为一个没有副作用的节/函数。
https://stackoverflow.com/questions/4041541
复制相似问题