C++ C++;Windows API比ifstream慢?还有别的办法吗?

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

我有一个5MB制表符分隔的文件,需要读入。我使用的是
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
    }
}