c - 为什么这个更快?提交 1 与提交 2

标签 c memory time

在 Hackerearth 上发布的练习问题。

编写一个程序来打印给定范围内的数字。但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于三和五的倍数的数字,打印“FizzBu​​zz”。在每个字符串或数字后打印一个新行。

输入格式 第一行将是测试用例的数量 T。下一行将有 T 个整数,用 N 表示。

输出格式 对于每个测试用例,打印从 1 到 N 的数字。但请遵循问题陈述中给出的规则。

约束

1 <= T <= 10

N 是一个整数。

提交1:

#include <stdio.h>
int main() {
    int uc;
    scanf("%d",&uc);
    int inp[uc];
    int l=0;
    for(l=0;l<uc;l++){
        scanf("%d",&inp[l]);
    }
    for(l=0;l<uc;l++){

        int s;
        for(s=1;s<=inp[l];s++){
            if(s%5==0&&s%3==0){
                printf("FizzBuzz\n");
            }else if (s%3==0) {
                printf("Fizz\n");
            }else if(s%5==0){
                printf("Buzz\n");
            }else
            {
                printf("%d\n",s);
            }

        }
    }
    return (0);
}

提交2:

#include <stdio.h>
int main() {
    int uc;
    scanf("%d",&uc);
    int inp[uc];
    int l=0;
    for(l=0;l<uc;l++){
        scanf("%d",&inp[l]);
    }
    for(l=0;l<uc;l++){
        int k=inp[l];
        int s=1;
        for(s=1;s<=k;s++){
            if(s%3==0&&s%5==0){
                printf("FizzBuzz\n");
            }else if (s%3==0) {
                printf("Fizz\n");
            }else if(s%5==0){
                printf("Buzz\n");
            }else
            {
                printf("%d\n",s);
            }

        }
    }
    return (0);
}

当我执行时。

第1步:输入2

第2步:输入3

第三步:输入15

我发现提交 2 比提交 1 更快。

Submission             Time                Memory
1                      1.006  s            64KB
2                      1.0058 s            64KB

现在我的问题是为什么?

最佳答案

在所有此类测试中,由于操作系统任务切换等原因,总会存在一些小缺陷。如果您想优化这些程序中的任何一个,您应该使用分析器来分析(完全机器优化的,例如使用 -O3)代码并优化分析器识别的瓶颈。

尽管如此,如果您在完全禁用优化的情况下进行编译,第一个解决方案比第二个解决方案稍微慢一点是有道理的,因为第二个解决方案包含提升 inp[l]< 形式的微优化 在内循环之外,以便每个唯一值仅对表达式求值一次。

关于c - 为什么这个更快?提交 1 与提交 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33796107/

相关文章:

c - 带有 setuid/capabilities 的 stdbuf

php - Httpd Process 高内存使用率和缓慢的页面加载

c++ - 这里需要内存屏障 "*pEnd_ = v; __sync_synchronize ();++pEnd_;"吗?

java - 计算两次android之间的差异

linux - 系统日期不会设置过去的当前日期(Ubuntu)

javascript - 将秒转换为 HH :MM:SS

c - Matlab 在使用某些数据运行 mex 函数时崩溃

C 计算一串数字中出现次数最多的数字

c - While 循环中表达式的双括号

c++ - STL算法和back_inserter可以预分配空间吗?