0

我有一个包含数据的文件(10-20MB),其中每一行都是一条数据。

我有一个从文件系统读取文件的 C 程序,然后根据命令行输入,它读取文件的每一行,对每一行进行计算以确定是否应该返回该行,然后返回数据。

假设程序在开始时做了一个 fread 并将整个文件读入内存,然后直接从内存中解析。

如果我不是从文件系统读取数据,而是通过创建如下所示的数组将数据直接编译到程序中,程序会执行得更快吗?

char *dataArray[] = {"data1", "data2", "data3"....};

由于操作系统需要从文件系统读取整个二进制文件,我的直觉是这两种技术的执行时间是相似的,因为从文件系统读取将是高位。但是,有人对此有更明确的想法吗?

4

2 回答 2

3

将所有内容定义为程序文字肯定会更快。

您不需要对数据文件进行相对较慢的“打开”调用,也不需要将数据从缓冲区移动到存储中。

这是一个常见的优化。1970 年,从那以后的每一本编程/编码风格书籍都强烈建议你不要这样做。实际的性能提升是微乎其微的,而您获得的性能却失去了可维护性和灵活性。

如果您想对此类问题进行快速可维护的优化,请查看“ mmap ”调用,它使缓冲区直接可用于您的程序并最大限度地减少数据移动。

于 2012-04-10T04:07:55.920 回答
1

我怀疑执行时间的差异会很大,但从内存利用率的角度来看,将数据放入可执行文件(并对其const进行适当的限定)会产生很大的不同。

如果您从文件中读取 10-20 兆数据到程序中分配的内存中(例如 via malloc),这些数据最初存在于内存中的两个位置:文件系统缓存和程序的私有内存。如果内存紧张,可以丢弃前一个副本,但后者占用物理内存或永久交换,直到它被释放。

另一方面,如果 10-20 兆数据是程序映像的一部分(在可执行文件中),则数据将被按需分页,并且可以在需要时丢弃,因为操作系统知道如果它可以重新加载页面再次需要它们。

于 2012-04-10T04:05:51.643 回答