读取文件字符的效率

Efficiency reading chars of a file

提问人:MrKleeblatt 提问时间:12/30/2022 最后编辑:n. m. could be an AIMrKleeblatt 更新时间:12/30/2022 访问量:62

问:

我训练自己构建编译器。当我读取文件时,我有时需要在我当前位置之前查看几个字符,以知道我必须生成哪个令牌。

在这种情况下,我想到了两种选择:

  • 我首先读取整个文件,然后使用索引变量访问字符
  • 我一次读了一个字符,以防万一我必须回到我使用的一些以前的角色getc(file);fseek(file, -1, SEEK_CUR);

这些选项中哪一个更有效?你更喜欢哪个?

C 性能 IO FSEEK

评论

1赞 Barmar 12/30/2022
第一种的启动成本很高,但比其他代码更有效。第二种方法将成本分摊到程序的整个运行过程中。除非源文件是几兆字节,否则差异可以忽略不计,所以做任何对你来说最容易的事情。
1赞 Barmar 12/30/2022
请注意,stdio 使用缓冲 I/O,因此大多数情况下,当您进行回溯时,它不必访问磁盘上的文件。它本质上与第一个选项做同样的事情。
1赞 Andreas Wenzel 12/30/2022
使用 ungetc 而不是 .但是,在某些平台上,您只能推回一个字符。fseek
7赞 Barmar 12/30/2022
过早的优化是万恶之源。做任何你认为最自然、最易读的事情,如果它成为性能瓶颈,就对其进行优化。
1赞 Andreas Wenzel 12/30/2022
根据 ISO C11 标准的 §7.21.9.2 ¶4,将在文本流上调用未定义的行为。但是,这在符合 POSIX 的平台上不会成为问题,因为 POSIX 定义了行为。在非 POSIX 平台上,您可以调用,然后稍后返回该位置。fseek(file, -1, SEEK_CUR);ftellfseek

答:

1赞 MrKleeblatt 12/30/2022 #1

感谢您的评论。我的决定是先完全读取文件,然后检查是否遇到任何性能问题。