C ++比fgetc更好的东西?

时间:2014-09-24 09:43:53

标签: c++ performance fgetc

我有一个巨大的文件,我正在阅读fopen& fgetc在循环中。

在fopen中用“rb”标志读取整个文件大约需要6秒钟,文件中大约有25k行。

我在想;有什么比fgetc更快的方式?首先在char *数组中加载所有内容是否更好?是更好吗?

  • 请注意,如果它是fgetc的方式,或者如果我能够至少通过数组中的char获取char,那就更好了。

  • 比fgetc更好的方法是什么?

3 个答案:

答案 0 :(得分:1)

fgetc已经非常优化了,因为它使用了fopen的底层缓冲。只需为每个角色调用一个函数(但不是系统调用)。您可以尝试使用setbuffer:

来增加缓冲区大小(正如您所说的那样读取大文件)
#define SIZE 65536
// or use even greater size if appropriate ...
char buffer[SIZE];

fd = fopen(...);
setbuffer(fd, buffer, SIZE);

或者,您是否需要为每个角色读取字符?

答案 1 :(得分:0)

如果文件是文本文件,则可能由合理大小的行组成。然后你可以尝试逐行阅读,例如使用std::getline(或在C中,getline(3)

如果您使用Posix系统,例如Linux,您可以使用syscalls(2)read(2)等低级mmap(2)。一定要有足够大的缓冲区,例如16K字节或64KBytes。

BTW,如果在Linux上,请尝试time wc yourbigfile,它应该让您了解读取文件所需的时间下限。请记住,有一个文件系统缓存:请参阅http://linuxatemyram.com/了解更多信息。

我的Linux桌面系统wc上的

的6Mbytes,100Klines文件大约需要0.1秒实时。

或许阅读Advanced Linux Programming,至少如果您在Posix系统上运行程序。

BTW,你的问题是操作系统,也许是文件系统特定的。

答案 2 :(得分:0)

我的代码的整个问题是我每次想要“返回”一个字符时都使用fget_pos和fset_pos,有ungetc显着提高了速度!