c - 比 fgets 更快的 I/O 函数

标签 c performance io

我正在用 C 编写解释器,目前正在研究词法分析器。我使用 fgets 逐行读取源文件内容。

然而,在我的电脑上,读取一个 100,000 行,每行 50 个字符的文件大约需要 8 秒,而读取一个 10 行,每行 50,0000 个字符的文件需要 0.2 秒(增加行的长度并没有真正改变任何东西)。我认为这是由于 fgets 很慢。我确实编写了自己的逐行阅读器,但我得到了相同的结果。

解释器必须处理大文件,因此将整个文件读入缓冲区并不是一个真正的选择。所以,我现在想问是否有人对浏览这些文件有更好的想法。如果解决方案独立于平台当然会很好,但如果不是,我可能可以解决这个问题。

最佳答案

这是因为 fgets 是面向行的。这意味着在您的 0.2 秒示例中 fgets 仅被调用了 10 次,而在另一个示例中 fgets 被调用了 100,000 次。

因此,在您的“快速”示例中,您只会承受与 10 次函数调用相关的开销。在较慢的示例中,您承受了 100,000 次函数调用的开销。

fgets 处理一行的速度非常快,即使是很长的行。与调用 fgets 函数的时间相比,在 fgets 内部花费的时间非常少。因此,更少的 fgets 调用会产生您看到的结果,因为大部分“开销”都在调用 fgets 中,而不是在 fgets 的作用中。

关于c - 比 fgets 更快的 I/O 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554300/

相关文章:

c++ - 为什么我可以在 C 而不是 C++ 中设置一个匿名枚举等于另一个?

java - 在检索图像时已为此响应调用 getOutputStream()

c - C 中的链表太慢

optimization - 通过 XLS 操作提高性能

php - is_file 与 file_exists 的性能以及 PHP 中的缓存?

java - 根据文本文件中的字节偏移确定行号

haskell - GHCi 和编译的代码似乎表现不同

java - 是否可以停止 JNI 调用

c - 在 GCC 进行的每次优化后获取汇编代码?

c - C 中的可变参数函数 f() 与 f(...)