【问题标题】:C++ Is there any way to make a program run faster?C++ 有什么方法可以让程序运行得更快吗?
【发布时间】:2020-10-19 22:14:10
【问题描述】:

例如..如果我有。

#include <iostream>
using namespace std;

int main()
{
   int counter = 0;
   while (true)
   {
      cout << counter << endl;
      counter++
   }
}

假设我正在与其他计算机竞争数到 10 亿,这个循环的运行速度是否完全取决于计算机处理器的速度?或者我的程序运行速度是否有限制,可以更改?

【问题讨论】:

  • counter += 2; :)
  • 它的限制主要是因为输出每一行都很慢。通过不刷新每一行的流,它可以更快一点,这就是endl 所做的。您必须用换行符替换它。
  • 尝试预先计算输出并在几次调用中打印出来。
  • 将程序的输出通过管道传输到 /dev/null,这样终端(或其他输出窗口)的速度就不是一个因素。
  • C++ 更快,因为模板。示例:qsortstd::sort

标签: c++ performance loops iostream


【解决方案1】:

摆脱endl 并改用"\n"。计划至少将速度提高 4 倍。

将输出写入文件而不是屏幕。这对于另外 10 倍的速度提升应该是有好处的(或者如果你使用 SSD 的话会更多)。

【讨论】:

    【解决方案2】:

    使用&lt;cstdio&gt; 中的printf,它比cout 快一点。

    printf("%d\n", counter);
    

    【讨论】:

    • 想详细说明为什么?
    【解决方案3】:

    如果您使用 cout 但未使用库 &lt;cstdio&gt; 中的任何内容,则可以在 int main() 函数的开头编写此代码:

        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    

    【讨论】:

      【解决方案4】:

      您发布的程序的缓慢来自于将内部表示格式化为人类可读的形式(文本表示)并输出文本表示。

      未提及的一项优化是缓冲格式化输出,然后输出。例如,将格式化的文本写入缓冲区,然后每 100 个左右计数,使用块写入打印出缓冲区。目的是减少输出交易的数量,并使每笔交易有更多的数据。基本上,一个 1024 个字符的输出将比 1024 个 1 个字符的输出快。

      输出取决于您的程序无法控制的操作系统和其他因素。您的程序将用于输出的数据发送到操作系统并等待操作系统完成请求。完成时间取决于任务优先级和资源可用性(至少)。因此,如果您的程序可以以毫秒为单位计数,但 I/O 需要几秒钟,那么您的运气不佳,因为没有程序优化会有所帮助。

      【讨论】:

      • 您确实意识到 iostream 使用了通常进行缓冲的 streambuf,就像您所描述的那样? (哦,但至少我最近使用的大多数编译器使用的缓冲区比你描述的要大,所以你的方法可能会减慢速度)。
      • 是的,我知道流缓冲区,但我喜欢老式的控制方法。此外,每次调用输出都会产生开销,减少调用次数会减少开销,从而节省时间。
      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2020-06-02
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多