gpt4 book ai didi

C malloc/free + fgets 性能

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:49 25 4
gpt4 key购买 nike

当我遍历文件 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com