Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在屏幕上以c+打印2^20行整数+;快速(不到1秒)?_C++_Output - Fatal编程技术网

C++ 如何在屏幕上以c+打印2^20行整数+;快速(不到1秒)?

C++ 如何在屏幕上以c+打印2^20行整数+;快速(不到1秒)?,c++,output,C++,Output,我必须在屏幕上打印2^20行小于1秒的整数printf不够快,是否有其他易于使用的快速输出替代品 每行仅包含1个整数 我需要它来解决一个竞争性编程问题,我必须将其源代码提交给评委。有,您可以试用 如果只需要程序的计时速度,就可以打印到/dev/null(unix)。这是4MB的二进制整数数据。5 MB,如果你算上换行符。如果您喜欢二进制数据,只需将其作为二进制值写入任意位置即可 我想您也需要格式化。最好的方法是分配一个“大”字符串,这个字符串足够大,可以处理所有事情,在本例中是每个整数10+1个

我必须在屏幕上打印2^20行小于1秒的整数printf不够快,是否有其他易于使用的快速输出替代品

每行仅包含1个整数

我需要它来解决一个竞争性编程问题,我必须将其源代码提交给评委。

有,您可以试用


如果只需要程序的计时速度,就可以打印到/dev/null(unix)。

这是4MB的二进制整数数据。5 MB,如果你算上换行符。如果您喜欢二进制数据,只需将其作为二进制值写入任意位置即可

我想您也需要格式化。最好的方法是分配一个“大”字符串,这个字符串足够大,可以处理所有事情,在本例中是每个整数10+1个字符。这意味着11MB。这是一个合理的内存需求,在普通桌面系统上绝对可以分配。然后,使用
sprintf
将整数值写入字符串:

#include <cstdio>
#include <iostream>
#include <string>

int main()
{
  std::string buffer(11534336, '\0');
  for (int i = 0; i < 1048576; ++i)
  {
    std::sprintf(&buffer[i * (10 + 1)], // take into account the newline
                 "%010d\n", i);
  }

  std::cout << buffer;
}
#包括
#包括
#包括
int main()
{
字符串缓冲区(11534336,'\0');
对于(int i=0;i<1048576;++i)
{
std::sprintf(&buffer[i*(10+1)],//考虑换行符
“%010d\n”,i);
}

在printf中大约有三个主要的瓶颈

  • 解析算法(必须处理所有类型的输入/输出)
  • 基本转换(通常未针对特定目的进行优化)
  • 输入输出
治疗方法是

  • 一次处理多个条目
  • 以块为单位处理文件i/o
  • 针对您的具体问题微调基本转换
如果你的数字是有序的,你可以通过一次处理多个整数来大幅提高速度; e、 g


打印每个10个整数块后,必须更新字符串的公共部分,即使使用1 x sprintf+9x memcpy也可以做到。

扩展stefaanv提到的使用
putchar
,这是一个有点难看的C风格的hack,应该可以相当快地完成这项工作。它利用了ASCII十进制GIT是
0x30
0x39

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');
}
inline void print_int(int val)
{
char chars[10];//Max int=2147483647
整数位数=0;
if(val<0)
{
putchar('-');
val=-val;
}
做
{
字符[位数++]=((val%10)+0x30);
val/=10;
}while(val&&digits<10);
while(数字>0)
{
putchar(字符[--位]);
}
putchar('\n');
}

您所说的“打印”是什么意思?将它们显示在屏幕上,输出到文件中,甚至可能是“真的”打印出来?哪个操作系统?你想在哪里打印数字-控制台还是什么?你应该更specific@MarounMaroun&flyx 2^20大约为100万。如果每行为12字节,则达到12 Mb/s。可以在普通PC上完成。@Robert:-在屏幕上显示它们。Windows。您可能需要输出100万行inte的原因是什么你的终端有足够的回卷来读取它们吗?你有时间去看它们吗?我们曾经举办过一次hexdump竞赛,这是我们用来提高速度的事情之一。这可能有点帮助,但我认为它不会接近OP的要求……问题不仅仅是
printf
太慢了,这是因为终端无法处理这种吞吐量。@Wooble这是供在线评委使用的,所以标准输出将被重定向,而不会显示在物理终端上。这让我想起了hexdump竞赛,尽管制作hex稍微容易一些。
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');
}