如何在屏幕上打印2^20行C 的整数(1秒钟以下)
How to print on screen 2^20 lines of integers in c++ quickly (under 1 second)?
我必须在屏幕上打印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小数位数为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');
}
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- 在 1.5 秒内找到 3 到 4 个不同整数的中位数超过 2000 万
- 将有符号整数日期转换为Unix秒
- 将长整数秒转换为双精度浮点值
- 如何从中获取持续时间,如整数毫秒和浮点秒<chrono>数?