在使用MSVC ++ input.getline()读取非常大(3GB)分隔的文本文件之前,我想优化速度,增加输入缓冲区的大小:
ifstream input("in1.txt");
input.rdbuf()->pubsetbuf(NULL, 1024 * 1024);
然而,在执行代码时,速度没有提高,所以我想知道:
问候。
答案 0 :(得分:3)
您是否考虑过mmap()系统调用?
mmap()函数应在进程之间建立映射' 地址空间和文件,共享内存对象或键入的内存 宾语。通话的格式如下:
pa = mmap(addr,len,prot,flags,fildes,off);
MapViewOfFile是等效的窗口。
LPVOID WINAPI MapViewOfFile(__ in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess,__ in DWORD dwFileOffsetHigh,__ in DWORD dwFileOffsetLow,__ in SIZE_T dwNumberOfBytesToMap);
答案 1 :(得分:0)
关于缓冲的事情是它在许多层面上工作,你有库(ifstream)级缓冲,你有OS级缓冲和硬件级缓冲。改变其中任何一个的大小可能会对性能产生重大影响或不存在影响。
真实的是,该程序的“逻辑”将比IO的速度快得多。
就个人而言,除非瓶颈严重,否则我会留下它。
答案 2 :(得分:0)
使用CreateFile和ReadFile可以获得绝对最快的性能。使用FILE_FLAGS_SEQUENTIAL_SCAN打开文件。
使用2的幂的缓冲区大小读取。只有基准测试可以确定这个数字。我曾经看过它是8K。另一次我发现它是8M!这种情况变化很大。
这取决于CPU缓存的大小,操作系统预读的效率以及与执行许多小写操作相关的开销。
内存映射不是最快的方式。它有更多的开销,因为你无法控制块大小,操作系统需要在所有页面中出错。
答案 3 :(得分:0)
您可以尝试使用操作系统提供的内存映射文件功能,如果内存不是问题,请尝试在处理之前将整个文件读入内存。
答案 4 :(得分:-1)
我想优化速度
摆脱fstream
。一般而言,iostream是一个可怕的瓶颈。