如何在屏幕上打印2^20行C 的整数(1秒钟以下)

How to print on screen 2^20 lines of integers in c++ quickly (under 1 second)?

本文关键字:整数 1秒 20行 屏幕 打印      更新时间:2023-10-16

我必须在屏幕上打印2^20秒以下的整数printf的线不够快,以便在那里,还有其他易于使用的替代方案以快速输出吗?

每行仅包含1个整数。

我要求它用于一个竞争性编程问题,我的源代码我必须提交给法官。

有putchar和puts您可以尝试。

如果程序的正时速度是所有需要的,则可以打印到/dev/null(unix)。

是4 MB的二进制整数数据。如果您计算新线,则为5 MB。如果您喜欢二进制中的数据,只需将其写入二进制值的任何地方。

我假设您也需要格式化。这样做的最好方法是分配一个"巨大"字符串,该字符串足够大,可以处理所有内容,在这种情况下,每个整数是10 1个字符。这意味着11 MB。这是一个合理的内存要求,绝对可以在普通桌面系统上分配。然后,使用sprintf将整数值写入字符串:

#include <cstdio>
#include <iostream>
#include <string>
int main()
{
  std::string buffer(11534336, '');
  for (int i = 0; i < 1048576; ++i)
  {
    std::sprintf(&buffer[i * (10 + 1)], // take into account the newline
                 "%010dn", i);
  }
  std::cout << buffer;
}

请注意,有效的格式操作非常快。控制台窗口的物理输出将花费一些时间在Windows上,这是Windows控制台固有的,无法修复。例如,Coliru在17872年的条目之后时代,我认为这是5秒钟。因此,不幸的是,使用标准C( )不可能以这种速度打印到屏幕上。当您直接在GPU上执行所有操作并显示您创建的表面/纹理/图像时,您可以更快地进行操作,但这几乎不是练习的重点。

printf中大约有三个主要瓶颈

  • 解析算法(必须处理各种输入/输出)
  • 基本转换(通常不是出于您的特定目的进行优化)
  • i/o

治疗是

  • 在时间上处理多个条目
  • 块中的流程文件I/O
  • finetune您的特定问题的基本转换

如果您的数字井井有条,则可以通过一次处理多个整数来大大提高速度;例如

char strings[10*6];
memcpy(strings, "10000n10001n10002n10003n10004n", 30);
memcpy(strings + 30, "10005n10006n10007n10008n10009n", 30);
fwrite(strings, 60, 1, stdout);

打印了10个整数的每个块后,必须更新字符串的常见部分,即使使用1 x sprintf 9x memcpy。

扩展了Stefaanv提到的有关使用putchar的内容,这是一个有点丑陋的C风格黑客,应该很快地完成工作。它利用了ASCII小数位数为0x300x39的事实:

inline void print_int(int val)
{
   char chars[10];   // Max int = 2147483647
   int digits = 0;
   if (val < 0)
   {
      putchar('-');
      val = -val;
   }
   do
   {
      chars[digits++] = ((val % 10) + 0x30);
      val /= 10;
   }while (val && digits < 10);
   while (digits>0)
   {
      putchar(chars[--digits]);
   }
   putchar('n');
}