如何在最小化时间的同时最小化指针

时间:2014-07-10 06:43:57

标签: c performance pointers

在嵌入式应用程序中,我需要将二进制文件读入有限的内存中, 然后在最短的时间内解析它。

可以读取整个文件并分配内存:

char **array = malloc(sizeof(char *) * row);
for(char c = 0; c < 240; c++){ /*320 x 240 file*/
    array[c] = malloc(320);
}

这将导致至少240个指针,每个4字节

可替换地:

array = malloc(320*240);

最小化指针,但会导致每次访问的乘法 解析。如果没有硬件繁殖,那将是非常昂贵的。

对于解析,内存中一次至少需要三行。

从SD卡读取速度很慢,我不确定是否一次读取一行 解析将比一次读取整个文件慢,然后解析。

这个问题的答案将决定该问题的内存大小要求 处理器。当然,较小的处理器会更便宜,这是一个巨大的 因素,但解析时间可能是一个更大的因素。

1 个答案:

答案 0 :(得分:0)

如果不知道可用的文件访问器方法是什么就很难给出完整的建议,但是你可能想要考虑使用类似fread的东西一次读取一个指定大小的块,然后使用那个连续填充(如前所述)一个3缓冲区集。如下所示:

FILE *fileStream = fopen ("file.bin", "rb");
char **array = malloc(sizeof(char *) * 3);
int i = 0;
size_t bytesRead = 0;

while (!feof(fileStream))
{
    for (i = 0; i < 3; i++)
    {
        /* If read has returned some bytes - i.e. not at EOF */
        if (fread (&array[i], 1, 320, fileStream))
        {
            /* Assuming target knows size of array. Pass in number in iteration
             * so target function knows where the read ends */
            doProcessing (array, i);
         }
    }
}

这将允许文件流处理您在其内部缓冲区中关注的IO缓冲等,然后您可以使用fread来阅读单点菜单。

然而,在说这个时,我做了几个假设:

  1. 该fread功能可用于访问此SD卡
  2. 你的&#34;行&#34;基于结构实际上是您正在解析的二进制文件的声音,并且您必须存储为每行或换行符分隔的数据集填充的字节数。< / LI>