【问题标题】:Why this one is faster? Submission 1 vs Submission 2为什么这个更快?提交 1 与提交 2
【发布时间】:2016-02-21 03:15:54
【问题描述】:

在 Hackerearth 上发布问题以供练习。

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

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

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

约束

1

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

第 3 步:输入 15

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

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

现在我的问题是为什么?

【问题讨论】:

  • 提交#1 的执行时间为 更长 的时间为 200 微秒,如何更快?顺便说一句,这种差异在误差范围内(时间测量、流程启动的不确定性和其他因素)。基于单次运行,差异如此微不足道,完全没有理由明确得出一个程序比另一个程序“快”的结论。
  • 1.00581.006 快。要成为一名程序员,你需要知道这些事情......:)
  • 这是我的愚蠢错误,实际上 2 比提交 1 快......
  • @SandeepSinghRana 提交 2 有一个多余的 int s=1; 分配,这显然使它更快;-) 现在说真的,如果你真的问的是 0.2 毫秒的差异,你就不能认真了。跨度>
  • @dxiv 是的,您是对的....您可以将其作为答案发布并进行一些深入的解释。谢谢

标签: c memory time


【解决方案1】:

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

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

【讨论】:

  • 我认为hackerearth使用用于执行程序的cpu周期而不是挂钟时间来测量时间......@Seb
  • @SandeepSinghRana 该问题使用时间(以秒为单位)而不是 CPU 周期作为衡量标准。无论如何,我想你可能会发现我的假设是正确的,无论是使用时间还是 CPU 周期数作为衡量标准。
  • 即使我把 inp[l] 放在循环之外它也没有什么不同@Seb
  • @SandeepSinghRana 这就是我在第一段中试图解释的;这里有更严重的瓶颈,即任务切换偏差,您的实验也将测量 I/O 作为花费的大部分时间。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2014-08-07
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多