【问题标题】:Computing speed / make programs faster计算速度/让程序更快
【发布时间】:2016-12-11 12:54:52
【问题描述】:

我运行了以下程序,我的电脑用了 94 秒来执行(我有一个 i5 3.2 GHz cpu 和 4 Gb 内存)。

我认为打印一百万个数字需要 94 秒并不快。有没有办法让它更快?

当我不计算计数器变量时,为什么程序会在 0.016 秒内结束? (它真的会在 0.016 秒的时间段内循环一百万次吗?)

#include <iostream>

int main()
{
    for (int counter{1}; counter <= 1e6 ; ++counter)
{
    std::cout << counter << " ";
}

    return 0;
}

【问题讨论】:

  • you 能否在 94 秒内打印一百万个数字?我认为不是 :-) 更严重的是,是的,输出需要时间,尤其是对图形终端的大规模更新,您基本上是在更新整个屏幕。而且,是的,您的计算机可能 足够快,可以在百分之一秒内完成一百万次迭代。在本地测试它会在 0.008 秒内执行。
  • 在屏幕上书写是一个相当缓慢的过程,这就是原因。编译器优化了像“for”这样的循环,所以我认为没有任何方法可以让它更快,除非你想做一些很酷的魔法。
  • 一般来说,您不希望优化用户界面以获得超出用户实际感知的性能。用户只是不能在 94 秒内读取一百万个整数,因此整个优化企业毫无意义。将您的计算逻辑与表示逻辑分开。必要时优化计算。
  • 谢谢大家!我只是想知道是什么让这个过程变慢了是 cout。几天前我从这里看到了一些源代码,这是一个密码破解程序,旨在尝试所有可能的组合,这让我感到惊讶,因为它在尝试了 350 万种不同的组合后,在 2.5 秒内发现了 5 个字符的长传! (很酷的东西:P)

标签: c++ c++11


【解决方案1】:

这个问题与“计算速度”无关,也与“让程序更快”无关。递增计数器几乎不能算作计算,将文本发送到控制台(即调用 std::cout)的性能开销超过了将变量递增几个数量级的计算成本。

所以,这个问题是关于向控制台发送文本的缓慢性。

向控制台发送文本通常被视为不需要非常高效的事情,因此在大多数操作系统中,在大多数情况下,它有点慢。这是一种不幸的情况,因为软件在我们开发时通常会向控制台发送文本,因此会减慢开发过程,但还不错,因为生产环境中的软件通常不会这样做:日志被写入文本文件,这要快得多。

另外,请记住,向控制台发送文本的过程涉及诸如滚动之类的辅助开销因素:一旦您的屏幕填满了文本,每一行新文本都会导致控制台窗口滚动。那也挺贵的。

那么,想让您的打印程序运行得更快吗?启动后立即最小化控制台窗口;然后立即将其恢复到原始尺寸;你会发现它会完成的。几乎所有的开销都在于显示文本和滚动窗口。

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 2020-07-24
    • 2017-05-12
    • 2021-11-17
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多