C++ C++;Windows API比ifstream慢?还有别的办法吗?
我有一个5MB制表符分隔的文件,需要读入。我使用的是C++ C++;Windows API比ifstream慢?还有别的办法吗?,c++,winapi,visual-c++,file-io,C++,Winapi,Visual C++,File Io,我有一个5MB制表符分隔的文件,需要读入。我使用的是ifstream,也尝试过将CreateFile与ReadFile或CreateFileMapping一起使用,但这两种windows实现都比使用ifstream花费的时间稍长 我错过了什么重要的事情吗?从SO和Google那里,我觉得使用windowsapi可以加快速度 很抱歉代码太多,我想提供完整的函数,因为我不知道问题出在哪里 如有任何建议,将不胜感激 ifstreams: void ifstream_read(string file_n
ifstream
,也尝试过将CreateFile
与ReadFile
或CreateFileMapping
一起使用,但这两种windows实现都比使用ifstream
花费的时间稍长
我错过了什么重要的事情吗?从SO和Google那里,我觉得使用windowsapi可以加快速度
很抱歉代码太多,我想提供完整的函数,因为我不知道问题出在哪里
如有任何建议,将不胜感激
ifstreams:
void ifstream_read(string file_name)
{
string line, word;
ifstream inf;
vector<string> current_record;
inf.open(file_name.c_str()); //char*
while (! inf.eof() )
{
current_record.clear();
getline(inf, line);
istringstream iss(line);
while (iss >> word)
{
current_record.push_back(word);
}
//save current_record in my dataset
}
}
Windows文件映射:
void windows_map(wstring file)
{
HANDLE file_handle = INVALID_HANDLE_VALUE;
LPCWSTR file_name = (LPCWSTR)file.c_str();
stringstream ss;
file_handle = CreateFile(file_name,
GENERIC_READ, // open for reading
NULL, // do not share
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_FLAG_SEQUENTIAL_SCAN, // normal file
NULL);
HANDLE file_map = CreateFileMapping(file_handle, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID file_view = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);
ss << (char*)file_view;
UnmapViewOfFile(file_view);
CloseHandle(file_map);
CloseHandle(file_handle);
vector<string> current_record;
string line, word;
while(getline(ss, line, '\n'))
{
current_record.clear();
istringstream iss(line);
while (iss >> word)
{
current_record.push_back(word);
}
// save current_record to dataset
}
}
void windows\u映射(wstring文件)
{
句柄文件\u HANDLE=无效的\u HANDLE\u值;
LPCWSTR file_name=(LPCWSTR)file.c_str();
细流ss;
file\u handle=CreateFile(文件名,
GENERIC_READ,//打开进行读取
NULL,//不共享
NULL,//默认安全性
打开现有文件,//仅打开现有文件
文件\u标志\u顺序\u扫描,//普通文件
无效);
HANDLE file_map=CreateFileMapping(file_HANDLE,NULL,PAGE_READONLY,0,0,NULL);
LPVOID file\u view=MapViewOfFile(文件映射,文件映射,读取,0,0);
ss>word)
{
当前_记录。向后推_(word);
}
//将当前_记录保存到数据集
}
}
因此,您正在比较一辆车上有两名乘客的速度,以及另一辆车后面满载行李的速度。你不能称之为比较。在相同的负载、相同的道路、相同的道路和天气条件下运行两辆车
同样,不要使用逐字节复制到C字符串中,然后将其推入向量。在我看来,只要把内容读入内存,看看不同的方法阅读的速度有多快。我会说,甚至不要使用大内存(大的new
ed数组或向量)。只需使用一个缓冲区(或string
object),并不断覆盖它
在完全相同的文件(在相同的驱动器上)上进行性能测试。
如果Stream
是在ReadFile
上构建的,从根本上说,任何差异都将是由于每次读取的数据量。在ReadFile
示例中,您可以做得更多。例如,与两个循环相比,共有三个循环会产生很大的差异。值得注意的是,而(!eof())
是常见的错误源。此外,如果您希望我们对性能进行评论,那么您提供用于测量性能的数据是合理的。代码是不够的。显示输入数据和测量结果。@enhzflep表示,函数的第4个和第5个参数保留为0,使其加载整个文件。
void windows_map(wstring file)
{
HANDLE file_handle = INVALID_HANDLE_VALUE;
LPCWSTR file_name = (LPCWSTR)file.c_str();
stringstream ss;
file_handle = CreateFile(file_name,
GENERIC_READ, // open for reading
NULL, // do not share
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_FLAG_SEQUENTIAL_SCAN, // normal file
NULL);
HANDLE file_map = CreateFileMapping(file_handle, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID file_view = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);
ss << (char*)file_view;
UnmapViewOfFile(file_view);
CloseHandle(file_map);
CloseHandle(file_handle);
vector<string> current_record;
string line, word;
while(getline(ss, line, '\n'))
{
current_record.clear();
istringstream iss(line);
while (iss >> word)
{
current_record.push_back(word);
}
// save current_record to dataset
}
}