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