C malloc/free+;fgets性能
当我循环文件A中的行时,我正在解析该行并将每个字符串(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是否会带来巨大的性能
char*
)放入一个char**
在一行的末尾,我运行一个过程,包括打开文件B,使用fgets
、fseek
和fgetc
从该文件中获取字符。然后关闭文件B
我为每一行重复重新打开和重新关闭文件B
我想知道的是:
malloc
和free
是否会对性能造成显著影响,比如我应该使用静态的myArray[NUM\u STRINGS][MAX\u STRING\u WIDTH]
而不是动态的char**myArray
fseek
在文件B中“向后”移动,以重置我以前在文件B中的位置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”,则可能会浪费大量内存)。快乐的媒介是做许多动态数组实现所需要的事情