C++ 尽可能快地读取标准数据

C++ 尽可能快地读取标准数据,c++,optimization,io,C++,Optimization,Io,我一直在努力解决如何尽可能快地从标准输入中读取数据的问题。我的任务是对输入整数执行一些特殊操作。直接问题是用空格分隔的整数序列,EOF作为指示输入结束的标志。我已经用过了 while(cin>>a){ //以下是操作 } 但这还不够快。我听说编写自己的函数只读取整数可能是一种方法,但我不知道如何实现这种函数。你知道那件事吗? 那么C++中的标准输入是什么更快的阅读方式呢?请写下来,因为这是每个项目的解决方案,适合那些渴望一个真正快速的项目的人。。。 提前谢谢你,我在等待你的回复 至少有两个瓶颈,

我一直在努力解决如何尽可能快地从标准输入中读取数据的问题。我的任务是对输入整数执行一些特殊操作。直接问题是用空格分隔的整数序列,EOF作为指示输入结束的标志。我已经用过了

while(cin>>a){
//以下是操作
}

但这还不够快。我听说编写自己的函数只读取整数可能是一种方法,但我不知道如何实现这种函数。你知道那件事吗? 那么C++中的标准输入是什么更快的阅读方式呢?请写下来,因为这是每个项目的解决方案,适合那些渴望一个真正快速的项目的人。。。
提前谢谢你,我在等待你的回复

至少有两个瓶颈,一个是程序无法控制的瓶颈

瓶颈1-输入程序。
第一个瓶颈是从输入源获取数据。无论是磁盘驱动器、键盘还是鼠标,它都会比你的程序运行慢。操作系统控制着这个瓶颈

您可以通过执行块读取来提高效率,但稍后会详细介绍

瓶颈2-文本到内部表示法 第二个瓶颈涉及将一个或多个字符转换为内部数字。在处理文本时,没有办法绕过这一点;必须这样做

优化文本数字输入
处理输入文本数字的最快方法是将输入读入大缓冲区,并将内存中的文本转换为数字

>以C++流为例:

const unsigned int BUFFER_SIZE = 1024u;
unsigned char buffer[BUFFER_SIZE];
cin.read((char *)buffer, BUFFER_SIZE); // Read 1k at a time.
下一步,将文本转换为内部表示,有很多可能性。 我建议使用
std::istringstream

从cin读取
cin
读取时,所有优化都可能被扔进垃圾箱。与处理器的执行时间相比,用户输入数字的等待时间太长,优化不会给您带来任何意义。例如,如果我优化您的程序以节省100毫秒,用户将看不到任何效果,因为用户需要数千毫秒来输入一个数字(即使以每分钟60个字的高速输入)。如果你想要更快的处理,你必须把文本放入一个文件中

微优化 这种优化称为微优化。您可能正在优化一个代码区域,而该区域的执行不如另一个区域那么多。此外,如果对程序进行更改,优化可能会失败


在优化之前,请关注正确性和健壮性

不够快做什么?你需要多快?我必须实现一个程序,读取10^7个字符的序列,每个字符最多10^9个。我在一个数据上有很多操作要做。这就是为什么我想知道是否有一种更有效的读取数据的方法……”而且我在一个数据上有很多操作要做。”-这听起来更像是不是I/O阻碍了???@claudiordgz,如果你是说一个带同步(假)函数的同步-是的,我可以。但完成这项任务的皮尔逊告诉我们,使用任何形式的“cin”的更好方法是实现自己的阅读功能。这就是我不知道如何处理的问题。你有解决这种问题的想法吗?@vladimir1923:如果这是真的,那真的很少见,但在那些罕见得惊人的情况下,我用这个:它很快,但非常不安全,如果输入格式不正确,很容易崩溃。不要在实际代码中使用使用
cin
并不一定意味着它将由人输入。@Rufflewind你是对的。在我的例子中,在运行程序之前已经存在一些整数序列。该测试与ideone.com类似,在ideone.com中,粘贴代码后,您可以粘贴任意长度和复杂度的stdin。“那就运行这个程序,不管它有没有工作。”托马斯·马修斯非常感谢你,这是我一直在寻找的答案!但是有一些关于输入的细节使我的问题更加具体。也就是说,输入是ideone.com风格的,所以在运行之前已经存在大量的整数在等待我。我必须阅读它们中的每一个,同时对它们做一些操作,但复杂度为O(n)。所以while循环似乎是最好的解决方案。但是,如何将while(cin){//对单个int}的操作更改为流式函数呢?while循环是什么样子的?@vladimir1923:同样,您的瓶颈是将数据放入内存。您还可以通过提供自己的缓冲区来减少一些执行,在web上搜索“istream::rdbuf”。@vladimir1923:有许多函数可以将缓冲区中的数字文本转换为内部表示:
atoi、strtol、istringstream、sscanf
,等等。