【问题标题】:Most efficient way to write to the console?写入控制台的最有效方法是什么?
【发布时间】:2012-06-22 01:17:15
【问题描述】:

我想做一个 iostream 类型的类。我想找到将一组字符写入屏幕的最有效方法。 想法:

printf-我不想要我自己需要的类型格式化。
WriteConsole-Read 是否比 printf 慢?对/错?
*组装-不知道如何
其他的?

*我主要关心的是我是否能找到方法。就时间而言,我并不着急。

编辑:由于某种原因,WriteConsole 速度较慢。

【问题讨论】:

  • 我认为 WriteConsole 会更快,因为它是一个直接的 winapi 函数,但我还没有听过/读过任何关于这个主题的内容。
  • 为什么?这是您代码的瓶颈吗?如果是这样,您将太多数据打印到控制台。
  • 如果您设法编写了以后需要修改的任何内容,我会感到非常惊讶。最快的方法可能是安排到控制台的内存映射部分,然后对该缓冲区执行 memcpy 或 0 复制写入。不过这太疯狂了!
  • 如果您想要原始速度,您可能不得不绕过正式的标准化机制并深入研究非常低级的机制。但是,您的帖子充满了过早优化的味道,这通常是人们最终不得不重写代码的主要原因,而不是因为它一开始就不够快。您首先应该寻求正确性,而控制台 I/O 之类的机会是您的正确解决方案甚至不需要优化。
  • 点击复选标记接受答案。

标签: c++ windows console


【解决方案1】:

使用“fwrite”:

fwrite( buffer, size, 1, stderr );

这将比您需要的要快得多。而且你有一个好处,你可以让你的 iostream 类不仅可以写入控制台,还可以写入文件。

【讨论】:

    【解决方案2】:

    我建议尝试几种方法(您在其中提到了几种方法)并对结果进行基准测试。你可能会对你的结果感到惊讶,但即使结果如你所愿,你至少可以确定你正在尽你所能。不过,作为记录,如果您发现比 printf 快得多,我会感到惊讶。

    最实用的编码方式(根据我的经验)遵循以下原则:

    1. 获得功能上执行的东西。
    2. 设置基准以测试您的解决方案是否足够快。
    3. 如果不够快,请尝试其他方法,然后返回 2。
    4. 如果速度足够快,您就完成了!

    听起来您甚至还没有从您的问题开始设计/编码。谨防过早的优化...

    【讨论】:

    • 在向屏幕发送“PRINT”垃圾邮件 20,000 次后,我明白人们的意思了。我会选择 printf,因为它只需要 5 秒
    【解决方案3】:

    我发现对于 Windows,使用 WriteConsoleOutputCharacter() 的平均值与使用 fwrite()stdout 大致相同,并且如果您不使用 <stdio.h>,则需要少一个文件。两者都非常快。我没有测试FillConsoleOutputCharacter()。我可能也没有使用那么好的基准。至于过早的优化,当我为控制台窗口创建一个很酷的小库时,我必须首先解决这个问题,它或多或少地把它变成了一个基于 Windows 的环境,并由一个总体系统来管理它。我将此系统用于大学和个人基于文本的游戏。对于使用cout 和朋友的日志记录和类似行为,尽管速度很慢(呃),但效果也一样好。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多