使用不同的格式说明符更快的输出
Faster outputs with a different format specifier
在下面的示例中
#include <stdio.h>
#include <math.h>
int main(void) {
int t,n,x,i;
long int num;
scanf("%d",&t);
while(t--){
scanf("%d",&n);num=0;
for(i=1;i<=n;i++){
scanf("%d",&x);
num=num+(x*pow(10,(n-i)));
}
printf("%ld\n",num);
}
return 0;
}
样本输入一组耗时0.03s。
当我将格式说明符从 %ld
更改为 %d
时,在 printf 中,对于相同的值和输入数量,示例花费了 0.02s 的时间。
在这两种情况下,num
都是 long int
类型,并以该形式计算。
为什么会发生这种情况,即使两种情况下的结果大小相同?
您的计时结果有多准确?如果您使用 time
命令,它只会给您两位小数,因此 0.03
和 0.02
之间的差异并不显着(例如,它实际上可能是 0.02500001
0.02499999
四舍五入前)。使用更长的输入并重复测试几次,对结果取平均值,并查看标准差以查看差异是否具有统计显着性。
也就是说,根据您的平台,int
和 long int
也可能具有相同的大小,从而使两者等效。如果不是,则取决于您平台上的 C 库是否实际使用不同的例程来解析与普通整数相比的长整数。我希望在内部它总是使用相同的例程,即最长可能整数大小的例程,并将结果转换为请求的类型。
When I changed the format specifier from %ld to %d ...
... 是 未定义的行为 (UB)。
long int num;
...
printf("%d\n",num); // mis-matched specifier and data type.
尽管 OP 可能会收到 un-posted 输入的预期结果,但由于 UB,性能比较是 moot。
执行时序比较时,数据集、测试顺序(由于内存缓存)和许多因素都会产生影响。为了进行良好的分析,post 没有 未定义行为的代码 和 运行 时的代码本身就存在差异。
在下面的示例中
#include <stdio.h>
#include <math.h>
int main(void) {
int t,n,x,i;
long int num;
scanf("%d",&t);
while(t--){
scanf("%d",&n);num=0;
for(i=1;i<=n;i++){
scanf("%d",&x);
num=num+(x*pow(10,(n-i)));
}
printf("%ld\n",num);
}
return 0;
}
样本输入一组耗时0.03s。
当我将格式说明符从 %ld
更改为 %d
时,在 printf 中,对于相同的值和输入数量,示例花费了 0.02s 的时间。
在这两种情况下,num
都是 long int
类型,并以该形式计算。
为什么会发生这种情况,即使两种情况下的结果大小相同?
您的计时结果有多准确?如果您使用 time
命令,它只会给您两位小数,因此 0.03
和 0.02
之间的差异并不显着(例如,它实际上可能是 0.02500001
0.02499999
四舍五入前)。使用更长的输入并重复测试几次,对结果取平均值,并查看标准差以查看差异是否具有统计显着性。
也就是说,根据您的平台,int
和 long int
也可能具有相同的大小,从而使两者等效。如果不是,则取决于您平台上的 C 库是否实际使用不同的例程来解析与普通整数相比的长整数。我希望在内部它总是使用相同的例程,即最长可能整数大小的例程,并将结果转换为请求的类型。
When I changed the format specifier from %ld to %d ...
... 是 未定义的行为 (UB)。
long int num;
...
printf("%d\n",num); // mis-matched specifier and data type.
尽管 OP 可能会收到 un-posted 输入的预期结果,但由于 UB,性能比较是 moot。
执行时序比较时,数据集、测试顺序(由于内存缓存)和许多因素都会产生影响。为了进行良好的分析,post 没有 未定义行为的代码 和 运行 时的代码本身就存在差异。