C malloc/free+;fgets性能

C malloc/free+;fgets性能,c,performance,malloc,fseek,C,Performance,Malloc,Fseek,当我循环文件A中的行时,我正在解析该行并将每个字符串(char*)放入一个char** 在一行的末尾,我运行一个过程,包括打开文件B,使用fgets、fseek和fgetc从该文件中获取字符。然后关闭文件B 我为每一行重复重新打开和重新关闭文件B 我想知道的是: 使用malloc和free是否会对性能造成显著影响,比如我应该使用静态的myArray[NUM\u STRINGS][MAX\u STRING\u WIDTH]而不是动态的char**myArray 打开和关闭文件B是否会带来巨大的性能

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

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

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


我想知道的是:

  • 使用
    malloc
    free
    是否会对性能造成显著影响,比如我应该使用静态的
    myArray[NUM\u STRINGS][MAX\u STRING\u WIDTH]
    而不是动态的
    char**myArray

  • 打开和关闭文件B是否会带来巨大的性能开销(概念上是数千次)?如果我的文件A已排序,是否有办法使用
    fseek
    在文件B中“向后”移动,以重置我以前在文件B中的位置

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

  • 我的文件B实际上是24个文件中的一个。而不是打开同一个文件B1一千次,然后B2一千次,等等。我打开文件B1一次,关闭它,B2一次,关闭它,等等。这将数千次的
    fopen
    fclose
    操作减少到大约24次

  • 我使用了
    revind()
    重置文件指针


  • 这使得速度提高了大约60倍,这已经足够了。感谢您给我指出
    revind()

    如果您的动态数组随着时间的推移而增长,则某些
    realloc
    会产生复制成本。如果你使用“总是加倍”的启发式,这是摊销到O(n),所以它不是可怕的。如果您提前知道大小,那么堆栈分配的数组仍然会更快


    关于第二个问题,请阅读关于
    倒带
    。它必须比一直打开和关闭都要快,并且可以让您进行更少的资源管理。

    如果您的动态阵列随着时间的推移而增长,则在某些
    realloc
    s上会有复制成本。如果你使用“总是加倍”的启发式,这是摊销到O(n),所以它不是可怕的。如果您提前知道大小,那么堆栈分配的数组仍然会更快


    关于第二个问题,请阅读关于
    倒带
    。它必须始终比打开和关闭要快,并且允许您进行更少的资源管理。

    打开和关闭的开销是可变的,这取决于其他程序是否在竞争该资源

    首先测量文件大小,然后使用该大小预先计算数组大小,以进行一次大堆分配

    你不会马上得到一个多维数组,但是一点指针算法,你就在那里了


    不能在另一个文件中缓存位置信息,然后使用以前的查找索引作为偏移量,而不是打开和关闭它吗?实际上取决于确切的逻辑。

    打开和关闭的开销是可变的,这取决于其他程序是否在竞争该资源

    首先测量文件大小,然后使用该大小预先计算数组大小,以进行一次大堆分配

    你不会马上得到一个多维数组,但是一点指针算法,你就在那里了


    不能在另一个文件中缓存位置信息,然后使用以前的查找索引作为偏移量,而不是打开和关闭它吗?实际上取决于确切的逻辑。

    使用动态内存总是会影响性能。使用静态缓冲将提供速度提升

    重新打开文件也会对性能造成影响。可以使用fseek(pos,SEEK\u SET)将文件指针设置为指向文件中的任何位置,也可以使用fseek(offset,SEEK\u CUR)进行相对移动


    重要的性能影响是相对的,您必须确定这对您自己意味着什么。

    使用动态内存总是会对性能造成影响。使用静态缓冲将提供速度提升

    重新打开文件也会对性能造成影响。可以使用fseek(pos,SEEK\u SET)将文件指针设置为指向文件中的任何位置,也可以使用fseek(offset,SEEK\u CUR)进行相对移动

    显著的性能影响是相对的,您必须确定这对您自己意味着什么

  • 我认为最好是分配资源 您需要的实际空间,以及 开销可能不会太大 重要的这避免了两者 浪费空间和堆栈溢出

  • 对。虽然IO是缓存的, 您正在进行不必要的系统调用 (打开和关闭)。将fseek与 可能是
    SEEK\u CUR
    SEEK\u SET

  • 我认为最好是分配资源 您需要的实际空间,以及 开销可能不会太大 重要的这避免了两者 浪费空间和堆栈溢出

  • 对。虽然IO是缓存的, 您正在进行不必要的系统调用 (打开和关闭)。将fseek与 可能是
    SEEK\u CUR
    SEEK\u SET


  • 我想知道的是:

    • 你的代码工作正常吗
    • 它跑得够快吗

    如果这两个答案都是“是”,不要改变任何事情

    我想知道的是:

    • 你的代码工作正常吗
    • 它跑得够快吗
    如果这两个答案都是“是”,不要改变任何事情

    在这两种情况下,性能都会受到一定的影响,但影响的程度取决于文件的大小和程序运行的环境

  • 如果您确实知道字符串的最大数量和最大宽度,则速度会快得多(但如果使用的内存少于“max”,则可能会浪费大量内存)。快乐的媒介是做许多动态数组实现所需要的事情