2012-04-10 100 views
0

我有一个包含数据,其中每一行是一个单件的数据的文件(10-20MB)。我有一个C程序,从文件系统中读取文件,然后基于命令行输入,它读取文件的每一行,在每一行上进行计算以确定是否应该返回该行,然后返回数据的一个子集。读取数据VS的数据编译直接进入程序

假定程序执行一个的fread和读取整个文件到内存在开始,然后直接从存储器分析它。

请问程序执行的,而不是从文件系统读取它更快,如果,我的数据编译为程序直接,通过创建一个阵列,例如下面的?

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

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

+1

是的,它可能会快一点就在编译。 – Ryan 2012-04-10 04:02:16

+1

其他的事情要考虑的是,如果有人需要更新数据文件或没有(如果该文件是错误的,并有多坏程序可以打破或失踪之后) 。 – Thilo 2012-04-10 04:06:13

回答

3

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

你不需要相对缓慢的“开放”呼吁的数据文件,你不需要从缓冲区中的数据移动到您的存储。

这是一个常见的优化大约。 1970年以后,每一种编程/编码风格的书籍从此强烈建议你不要这样做。实际的性能提升是最小的,你在性能上获得的可维护性和灵活性会有所损失。

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

+0

直到最后一段我都不同意你的回答,但当然你是对的,'mmap'可以是一个很好的选择。 – 2012-04-10 13:11:39

1

我怀疑执行时间的差异会很大,但从内存使用的角度来看,将数据放入可执行文件(并适当地限定它)将会产生很大的差异。

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

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