C++ 如何在C+中从流执行快速格式化输入+;?

C++ 如何在C+中从流执行快速格式化输入+;?,c++,performance,stl,file-io,C++,Performance,Stl,File Io,情况是:有一个文件包含14294508个无符号整数和1399497个浮点数(需要读取doubles)。总文件大小约为250 MB 使用std::istream需要约30秒。将数据从文件读取到内存(仅复制字节,无需格式化输入)要快得多。有没有办法在不改变文件格式的情况下提高读取速度?是否需要使用STL样式的i/o?你必须从一位专家那里找到一件优秀的作品。这是迪特马尔·库尔(Dietmar Kuhl)专门制作的iostream 我不想提出这个建议,但请看一下C格式的I/o例程。另外,您是否一次读取了

情况是:有一个文件包含14294508个无符号整数和1399497个浮点数(需要读取
double
s)。总文件大小约为250 MB


使用
std::istream
需要约30秒。将数据从文件读取到内存(仅复制字节,无需格式化输入)要快得多。有没有办法在不改变文件格式的情况下提高读取速度?

是否需要使用STL样式的i/o?你必须从一位专家那里找到一件优秀的作品。这是迪特马尔·库尔(Dietmar Kuhl)专门制作的
iostream


我不想提出这个建议,但请看一下C格式的I/o例程。另外,您是否一次读取了整个文件?

您可能还想看看Matthew Wilson的FastFormat库:


我没有用过它,但他提出了一些令人印象深刻的主张,我发现他的许多其他作品都值得研究和使用(有时也值得偷窃)。

您还没有指定格式。您可以对其进行内存映射,也可以读取非常大的数据块并以批处理算法进行处理


另外,您还没有说明是否确实知道将读取它的文件和进程将在同一平台上。如果一个大端进程写它,而一个小端进程读它,或者反之亦然,它就赢了;“工作”。

解析输入(ATOI和ATOF),通常比“通用”读取方法提高速度至少两倍。

< P>快速而肮脏的东西是将文件转储到标准的C++字符串中,然后在其上使用String Fix:

#include <sstream>
// Load file into string file_string
std::stringstream s( file_string );
int x; float y;
s >> x >> y;
#包括
//将文件加载到字符串文件\u字符串
std::stringstreams(文件\字符串);
int x;浮动y;
s>>x>>y;

这可能不会给您带来太多的性能改进(通过避免iostreams,您将获得更大的速度),但它很容易尝试,而且可能足够快。

语法和方法不重要:)是的,我正在阅读整个文件。您尝试过fscanf和friends吗?我会说给他们一个机会,并测量一下。我认为你应该发布你的循环代码如果这是MSVC库,你可能想调查你从安全SCL(默认情况下打开)中受到了多少惩罚。不过,请注意理解关闭它的含义。对不起,这应该是:_SECURE_scl也许这些技术可以应用于输入