gpt4 book ai didi

c++ - mmap 比 getline 慢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:31 24 4
gpt4 key购买 nike

我面临着逐行读取/写入文件(以 Gig 为单位)的挑战。

阅读许多论坛条目和站点(包括一堆 SO)后,mmap 被建议为读取/写入文件的最快选项。但是,当我使用 readline 和 mmap 技术实现我的代码时,mmap 是两者中较慢的。阅读和写作都是如此。我一直在测试大约 600 MB 的文件。

我的实现逐行解析,然后标记该行。我将仅提供文件输入。

这是 getline 的实现:

void two(char* path) {

std::ios::sync_with_stdio(false);
ifstream pFile(path);
string mystring;

if (pFile.is_open()) {
while (getline(pFile,mystring)) {
// c style tokenizing
}
}
else perror("error opening file");
pFile.close();
}

这是mmap:

void four(char* path) {

int fd;
char *map;
char *FILEPATH = path;
unsigned long FILESIZE;

// find file size
FILE* fp = fopen(FILEPATH, "r");
fseek(fp, 0, SEEK_END);
FILESIZE = ftell(fp);
fseek(fp, 0, SEEK_SET);
fclose(fp);

fd = open(FILEPATH, O_RDONLY);

map = (char *) mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);

/* Read the file char-by-char from the mmap
*/
char c;
stringstream ss;

for (long i = 0; i <= FILESIZE; ++i) {
c = map[i];
if (c != '\n') {
ss << c;
}
else {
// c style tokenizing
ss.str("");
}

}

if (munmap(map, FILESIZE) == -1) perror("Error un-mmapping the file");

close(fd);

}

为了简洁起见,我省略了很多错误检查。

我的 mmap 实现是否不正确,从而影响了性能?也许 mmap 不适合我的应用程序?

感谢任何评论或帮助!

最佳答案

mmap 的真正强大之处在于能够在文件中自由查找,直接将其内容用作指针,并避免将数据从内核缓存内存复制到用户空间的开销。但是,您的代码示例没有利用这一点。

在您的循环中,您一次扫描缓冲区一个字符,附加到 stringstreamstringstream 不知道字符串有多长,因此必须在此过程中多次重新分配。此时,您已经消除了使用 mmap 带来的任何性能提升 - 即使是标准的 getline 实现也避免了多次重新分配(通过在 GNU C++ 实现中使用 128 字节的堆栈缓冲区)。

如果您想充分利用 mmap:

  • 不要复制您的字符串。完全没有。相反,将指针直接复制到 mmap 缓冲区中。
  • 使用strnchrmemchr 等内置函数来查找换行符;这些利用手工汇编程序和其他优化来比大多数开放编码搜索循环运行得更快。

关于c++ - mmap 比 getline 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com