更快的文件和内存写入

时间:2019-06-02 00:50:35

标签: c

我有如下定义的代码,但是它花费的时间太长,我知道原因是迭代次数太多,但是有没有一种解决方案可以使此循环更快,(每个循环必须从中读取一个浮点数一个文件并将其写入内存),共有15874861个数字。

  float  SysMem;
  float fw;
  unsigned long  j;
   for (j = 0 ; j < 15874861 ; j++) 
    {
      fscanf(fp,"%f",&fw); // Read from file
      *((float *) (weights+j*0x04))  = fw; // Write to memory
      // Below lines are just to test, but even just read from file and writing is taking too long.
      SysMem= *((float *) (weights+j*0x04)); // Read back from memory
      if(fw != SysMem) 
         printf("Memory Error\n"); // If read back wrong flag a error
    }

试图使其更快

3 个答案:

答案 0 :(得分:0)

通过将文件映射到内存(如果使用的是Linux,请使用mmap),并通过优化程度最高的程序进行编译(可以通过传递-O3标志来加快处理速度)您正在使用gcc / clang)

除了代替每次读取一次(并且不想使用mmap),还找到一种方法来一步读取大的浮点数,然后在需要更多内容时再次读取。

您也可以unroll the loop,因为您已经知道所需的迭代次数(或者您可以让编译器使用-O3标志对其进行优化)

编辑:不要自己展开循环,但要确保编译器通过使用适当的标志来尽最大努力展开循环

答案 1 :(得分:0)

这可能会有所不同,因为I / O是应该在这里发生的最慢的事情,但是所有这些强制转换都不会提高性能,甚至可能导致错误的代码。强制转换告诉编译器“我在这里做奇怪的事情”,这倾向于告诉编译器不要优化。

例如,在大多数平台上,float的大小为4字节,并且在4的倍数地址上分配4字节值比在任意地址处更快。当编译器看到类型为float或数组float的变量时,它将在内存中正确对齐此变量,以能够使用快速4字节分配方法。当编译器看到(float *) (weights+j*0x04)时,不确定是否为4的倍数,因此它可能会生成可以肯定地复制您期望的代码,但速度较慢,因为它会逐个复制单个字节。 (编译器不必生成较慢的代码:它很讨厌,并假设weights正确对齐,并且生成的代码如果weights未正确对齐则不会复制您的期望。 )

循环的主体应该是

fscanf(fp, "%f", weights[j]);

(假设您知道输入文件的格式正确,否则需要添加错误检查。)

答案 2 :(得分:0)

这就是我为数据操纵所做的。

{'IP - internet': {'IPv4': '225.138.42.248', 'IPv6': 'NA'}}

为什么我要这样做?

2原因,我没有在常规系统上运行它,而是定制板。 因此,我发现内存读/写的时间成本很高,IO也很慢。 所以我只是使用memcpy来移动数据。

谢谢大家的帮助和建议。