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

我有以下C99程序,它测量相对于加法的简单除法运算的性能。 但是,即使程序显然需要几秒钟来处理runAdditionrunDivision并且iterations设置为10亿, difftime函数仍会返回0。

 #include  #include  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)); } 

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

当在堆栈上推送参数以调用printf ,使用8个字节推送long long使用8个字节推送double 。 当函数printf读取格式字符串时,它首先要求4个字节的int ,以及8个字节的doubleprintf正确地获取int ,因为你是little-endian并且long long的前四个字节足以表示值。 然后printf得到double ,它获取long long的最后四个字节,然后是double的前四个字节。 由于long long的最后四个字节是零, printf认为是两个以四个字节值为零的开头,根据double精度的二进制表示,得到一个非常小的double值。

尝试使用%lld代替printf%d

 printf("%lld additions t ^^^ 

在此更改后正常工作。

使温度volatile以便它不会被优化掉。 编译器可能将其视为没有副作用的节/函数。

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

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

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

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