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

标签 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卡读取速度很慢,我不确定是否一次读取一行 解析会比一次读取整个文件然后解析慢。

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

最佳答案

在不知道可用的文件访问器方法是什么的情况下,很难给出完整的建议,但您可能需要考虑使用 fread 之类的方法一次读取指定大小的 block ,然后使用它来不断填充(正如已经说过的)一个 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. 基于“行”的结构实际上对于您正在解析的二进制文件来说是合理的,并且您不必存储为每行或换行符分隔集填充的字节数数据。

关于c - 如何在最小化时间的同时最小化指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24670062/

相关文章:

Javascript:在线测量代码执行时间

c - 如何将条件作为参数传递给 C 中的函数?

c - 如何将二维字符指针发送到内存分配函数?

C内存免混淆

c - 如果在多个系统调用中完成,为什么 TCP 套接字会变慢?

c++ - 声明一个二维指针对象数组

c - 警告 : format '%s' expects argument of type 'char *' , 但参数 2 的类型为 'char'

c - 为什么 printf 隐式 float 到整数的转换不起作用?

c - 测试文件到库文件,数组没有被正确读入 c 中的问题

python - 查找数组 B 中元素的索引与数组 A 中的元素最匹配