使用不同的格式说明符更快的输出

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.030.02 之间的差异并不显着(例如,它实际上可能是 0.02500001 0.02499999 四舍五入前)。使用更长的输入并重复测试几次,对结果取平均值,并查看标准差以查看差异是否具有统计显着性。

也就是说,根据您的平台,intlong 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 没有 未定义行为的代码 和 运行 时的代码本身就存在差异。