我有一个包含数据的文件(10-20MB),其中每一行都是一段数据。
我有一个从文件系统读取文件的C程序,然后根据命令行输入,它读取文件的每一行,对每一行进行计算以确定是否应该返回该行,然后返回数据的一个子集。
假设程序执行fread并在开始时将整个文件读入内存,然后直接从内存中解析它。
如果程序不是从文件系统中读取,而是通过创建如下的数组直接将数据编译到程序中,那么程序是否会执行得更快?
char *dataArray[] = {"data1", "data2", "data3"....};
由于操作系统需要从文件系统中读取整个二进制文件,我的直觉是两种技术的执行时间都相似,因为从文件系统读取将是高位。但是,有人会对此有更明确的想法吗?
答案 0 :(得分:3)
将所有内容定义为程序文字肯定会更快。
您不需要对数据文件进行相对较慢的“打开”调用,也不需要将数据从缓冲区移动到存储中。
这是一个常见的优化。 1970年,从那时起,每本编程/编码风格的书都强烈推荐你不要这样做。实际的性能提升很小,您在性能方面的优势在于您在可维护性和灵活性方面的损失。
如果您希望针对此类问题进行快速维护优化,请查看“mmap”调用,该调用使缓冲区可直接用于您的程序并最大限度地减少数据移动。
答案 1 :(得分:1)
我怀疑执行时间的差异是否显着,但从内存利用率的角度来看,将数据放入可执行文件(并使其const
适当地合格)会产生很大的不同。
如果从程序中读取文件中10-20兆的数据到分配的内存(例如通过malloc
),数据最初存在于内存中的两个位置:文件系统缓存和程序的私有内存。如果内存紧张,前一个副本可以被丢弃,但后者占用物理内存或永久交换,直到它被释放。
另一方面,如果10-20兆的数据是程序图像的一部分(在可执行文件中),则数据将被需求分页,并且可以在需要时丢弃,因为操作系统知道它可以重新加载页面,如果它再次需要它们。