C malloc/free + fgets 性能

标签 c performance malloc fseek

当我遍历文件 A 中的行时,我正在解析该行并将每个字符串 (char*) 放入 char** 中。

然后在一行的末尾,我运行一个过程,该过程包括打开文件 B,使用 fgetsfseekfgetc 来从该文件中获取字符。然后我关闭文件 B。

我为每一行重复重新打开和关闭文件 B。

我想知道的是:

  1. 使用 mallocfree 是否会对性能造成重大影响,因此我应该使用像 myArray[NUM_STRINGS][MAX_STRING_WIDTH] 这样的静态东西 而不是动态 char** myArray

  2. 打开和关闭文件 B 是否会产生显着的性能开销(概念上是数千次)?如果我的文件 A 已排序,我是否可以使用 fseek 在文件 B 中“向后”移动,以重置我之前在文件 B 中的位置?

编辑 结果表明,双重方法大大减少了运行时间:

  1. 我的文件 B 实际上是二十四个文件之一。而不是打开同一个文件 B1 一千次,然后 B2 一千次,等等。我打开文件 B1 一次,关闭它,B2 一次,关闭它,等等。这减少了数千次 fopenfclose 操作大约为 24。

  2. 我使用了 rewind() 来重置文件指针。

这产生了大约 60 倍的速度提升,这已经绰绰有余了。感谢您将我指向 rewind()

最佳答案

如果您的动态数组随时间增长,则某些 realloc 会产生复制成本。如果您使用“总是双重”启发式算法,这会被分摊到 O(n),所以它并不可怕。如果您提前知道大小,堆栈分配的数组仍然会更快。

对于第二个问题,请阅读关于rewind 的内容。它必须比一直打开和关闭的速度更快,并且让您进行更少的资源管理。

关于C malloc/free + fgets 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/988444/

相关文章:

c - 如何按字母顺序排列字符串并返回指向已排序字符数组的指针?

c++ - 在 C++ 和 OpenCV 上出现错误 : "malloc"

c - 释放无效指针?

javascript - console.log/warn/error - native 、普通 JavaScript 性能更高的替代方案?

performance - 如何查看特定文件的碎片?

c - 如何设置动态内存和临时缓冲区?

c - 这个程序在大端和小端系统上都兼容吗?

c - linux-kernel 模块中的系统调用拦截(内核 3.5)

c - C 中的 %f 和 %F 有什么区别?

mysql - 优化每个客户从销售表中购买的精选产品详细信息