【问题标题】:How to speed up program execution如何加快程序执行速度
【发布时间】:2015-02-19 14:17:34
【问题描述】:

这是一个非常简单的问题,但不幸的是,我被卡住了,不知道该怎么办。我的程序是一个简单的程序,它不断接受 3 个数字并输出 3 个中最大的一个。程序一直运行,直到用户输入一个字符。

正如标题所说,我的问题是如何让这个执行得更快(会有大量的输入数据)。任何可能包括使用不同算法或使用不同函数或更改整个代码的帮助都是可接受的。

我在 C++ 标准方面不是很有经验,因此不了解不同库中可用的所有不同功能,所以请说明你的原因,如果你太忙,至少尝试提供一个链接.

这是我的代码

#include<stdio.h>
int main()
  {
    int a,b,c;
    while(scanf("%d %d %d",&a,&b,&c))
      {
         if(a>=b && a>=c) 
            printf("%d\n",a);
         else if(b>=a && b>=c) 
            printf("%d\n",b);
         else 
            printf("%d\n",c);
      }
    return 0;
  }

它的工作非常简单。 while 循环将继续执行,直到用户输入一个字符。正如我之前解释过的,该程序接受 3 个数字并输出最大的数字。此代码没有其他部分,仅此而已。我已经尽力解释它了。如果您需要我的更多信息,请询问,(我会尽可能多地尝试)。

我正在使用CPP 4.9.2的互联网平台上编译(那里是这么说的)

我们将不胜感激任何形式的帮助。提前致谢

编辑

输入是由计算机完成的,所以输入没有延迟。

另外,我会接受 c 和 c++ 的答案。

更新

我还想问是否有任何通用库函数或算法,或任何其他类型的建议(某些我们必须做的事情和我们不能做的事情)可以遵循以加快执行速度(不仅仅是为了这段代码,但一般来说)。任何帮助,将不胜感激。 (很抱歉在没有提供任何参考资料的情况下提出如此尴尬的问题)

【问题讨论】:

  • 首先我会看看它是否需要更快。它可能已经足够快了。
  • IO 是你的开销。如果您想要性能,请避免使用“标准库”。
  • 为什么 foobar 这个问题的投票率如此之低?这是合理的,你可以从这样的任务中学到很多东西......
  • @ArunA.S - 尝试缓冲输入和输出。在从内存中处理文件之前读取更大的文件块,在printf 之前输出到内存。在这两种情况下,专注于少做更多的工作。

标签: c++ c


【解决方案1】:

您的“算法”非常简单,我会使用max() 函数来编写它,只是因为它的风格更好。

但无论如何……

花费最多时间的是scanf。这是你的瓶颈。您应该编写自己的读取函数,该函数使用fread 读取一个大块并对其进行处理。您可以考虑异步执行此操作 - 但我不建议将此作为第一步(某些异步实现确实比同步实现慢)。

所以基本上你做以下事情:

  1. 将一个大块从文件读入内存(这是磁盘 IO,所以这是瓶颈)
  2. 解析该块并找到您的三个整数(注意块边界!前两个整数可能位于一个块内,第三个位于下一个块内 - 或者块边界将您的整数分割在中间,所以让您的解析器只是捕获那些东西)
  3. 进行比较 - 与磁盘 IO 相比,它运行得非常糟糕,因此无需改进

【讨论】:

  • 视操作系统而定,可能有一些方便的 API 用于此目的,它们不会带来 stdio 函数的所有令人讨厌的开销。
  • 这就是主要问题出现的地方,我不知道如何使用max()fwrite。您能否解释一下或提供一个很好的链接,我可能会在其中找到解释。 (只是提醒您,我无法理解复杂的东西,因为我只是从学校获得了编程经验)
  • @ArunA.S 一个好的开始是pubs.opengroup.org/onlinepubs/9699919799/idx/head.html(可能不是当前版本,但已经足够了)- 从 stdio.h 开始并找到fwrite。阅读文档,尝试一些东西,你就会学习并变得更好。然后回到你原来的任务。不要尝试反过来:解决问题总是很糟糕,然后学习你应该如何解决它们;-)
  • cplusplus.com 也是查找有关标准库信息的好地方。例如。对于fwrite,请查看此页面:cplusplus.com/reference/cstdio/fwrite
【解决方案2】:

除非您保证三个输入数字都不同,否则我会担心让程序得到正确的输出。如前所述,除了输入和输出缓冲之外,几乎没有什么可以加速的,并且可能通过使用自定义解析和格式化代码来加速十进制转换,而不是通用的 scanfprintf

现在,如果您收到输入值 a=5、b=5、c=1,您的代码将报告 1 是这三个值中的最大值。将 > 比较更改为 >= 以解决该问题。

您可以通过记住以前的结果来最大程度地减少比较次数。你可以这样做:

int d;
if (a >= b)
    if (a >= c)
        d = a;
    else
        d = c;
else
    if (b >= c)
        d = b;
    else
        d = c;
[then output d as your maximum]

这恰好进行了 2 次比较,以找到 d 的值 max(a,b,c)

您的代码至少使用两个,可能最多使用 4 个。

【讨论】:

  • 好的,谢谢.....我会试试看(感谢您通知我这个简单的错误)。
  • 嗯,你帮我修复了一个我之前错过的错误,但它仍然不够快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
相关资源
最近更新 更多