C++比fgetc更好的东西
C++ Something better than fgetc?
我有一个巨大的文件,我正在用fopen&循环中的fgetc。
用fopen中的"rb"标志读取整个文件大约需要6秒,文件中大约有25k行。
我在想;有什么比fgetc更快的方法?先加载char*数组中的所有内容会更好吗?strcpy更好吗?
-
注意,如果是fgetc的方式,或者如果我至少能够在数组中逐个字符地获取,那就更好了。
-
有什么比fgetc更好的方法?
好的fgetc已经进行了相当多的优化,因为它使用了fopen的底层缓冲。只需为每个字符调用一个函数(而不是系统调用)。您可以尝试使用setbuffer:来增加缓冲区大小(正如您所说的,您正在读取巨大的文件)
#define SIZE 65536
// or use even greater size if appropriate ...
char buffer[SIZE];
fd = fopen(...);
setbuffer(fd, buffer, SIZE);
或者,你需要每个字符读取一个字符吗?
如果文件是一个文本文件,它可能由大小合理的行组成。然后,您可以尝试逐行读取,例如使用std::getline(或者,在C中,getline(3))
如果您在Posix系统(例如Linux)上,则可以使用底层系统调用(2),如read(2)或mmap(2)。确保有足够大的缓冲区,例如16K字节或64K字节。
顺便说一句,如果在Linux上,尝试time wc yourbigfile
,它应该会让您了解读取文件实际需要的时间的下限。请记住,有一个文件系统缓存:请参阅http://linuxatemyram.com/了解更多信息。
在我的Linux桌面系统wc
上,一个6M字节、100Klines的文件需要大约0.1秒的实时时间
也许可以阅读高级Linux编程,至少如果您在Posix系统上运行程序的话。
BTW,您的问题是操作系统,也许是文件系统特定的
我的代码的整个问题是,每次我想"返回"一个字符时,我都会使用fget_pos和fset_pos,这大大提高了速度!
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 比使用 s.str().c_str() 更好的表达?
- C++比fgetc更好的东西