当我遍历文件 A 中的行时,我正在解析该行并将每个字符串 (char*
) 放入 char**
中。
然后在一行的末尾,我运行一个过程,该过程包括打开文件 B,使用 fgets
、fseek
和 fgetc
来从该文件中获取字符。然后我关闭文件 B。
我为每一行重复重新打开和关闭文件 B。
我想知道的是:
使用
malloc
和free
是否会对性能造成重大影响,因此我应该使用像myArray[NUM_STRINGS][MAX_STRING_WIDTH] 这样的静态东西
而不是动态char** myArray
?打开和关闭文件 B 是否会产生显着的性能开销(概念上是数千次)?如果我的文件 A 已排序,我是否可以使用
fseek
在文件 B 中“向后”移动,以重置我之前在文件 B 中的位置?
编辑 结果表明,双重方法大大减少了运行时间:
我的文件 B 实际上是二十四个文件之一。而不是打开同一个文件 B1 一千次,然后 B2 一千次,等等。我打开文件 B1 一次,关闭它,B2 一次,关闭它,等等。这减少了数千次
fopen
和fclose
操作大约为 24。我使用了
rewind()
来重置文件指针。
这产生了大约 60 倍的速度提升,这已经绰绰有余了。感谢您将我指向 rewind()
。
最佳答案
如果您的动态数组随时间增长,则某些 realloc
会产生复制成本。如果您使用“总是双重”启发式算法,这会被分摊到 O(n),所以它并不可怕。如果您提前知道大小,堆栈分配的数组仍然会更快。
对于第二个问题,请阅读关于rewind
的内容。它必须比一直打开和关闭的速度更快,并且让您进行更少的资源管理。
关于C malloc/free + fgets 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/988444/