对于 cJSON,哪种方法更节省内存:单个 cJSON 对象还是 cJSON 数组?

问题描述 投票:0回答:1

我正在开发一个项目,其中使用 cJSON 库来处理 JSON 数据。我有一个场景,我需要表示成对的数值,并且我正在尝试优化内存使用。

我有两种不同的实现将数据添加到 cJSON 数组,我想知道就 cJSON 的内部表示而言,哪一种更节省内存。

void AddFOVToRender(int Radius) {
    cJSON* FOVArray = cJSON_CreateArray();
    cJSON_AddItemToArray(FOVArray, cJSON_CreateNumber(TYPE_FOV));
    cJSON_AddItemToArray(FOVArray, cJSON_CreateNumber(Radius));
    cJSON_AddItemToArray(jsonArray, FOVArray);
}
void AddFOVToRender(int Radius) {
    int fovValues[2] = { TYPE_FOV, Radius };
    cJSON_AddItemToArray(jsonArray, cJSON_CreateIntArray(fovValues, 2));
}

我问这个问题是因为我将发送大量共享内存数据,并且将其渲染在我的屏幕上,它需要尽可能快并且数据大小也很小,因为我将在以下位置渲染大量对象一次。

我有兴趣了解 cJSON 中哪种方法更节省内存。我已经查看了 cJSON 的文档,但找不到有关此类场景的内部表示或潜在内存优化的具体细节。

shared-memory cjson
1个回答
0
投票

我想你需要吸一下看看。

要使理论方法发挥作用,需要澄清许多假设。例如,我不知道 FOV 是整数还是浮点数,它会采用什么范围,或者由于精度问题最终会在对象内部分配多少个小数位(我见过像 1.3 这样的浮点数最终会被分配到对象内部)在 cJSON 中被表示为像 1.300000234 这样的双精度值。您最好的选择是生成一小段代码,它除了按照您的意图生成数据包并查看每种情况下的堆大小之外什么也不做。

另一个建议是生成 2 个对象,然后简单地执行如下操作:

static void _print_json_string(cJSON * json_obj, char * key)
{
    // must allocate to char pointer to free later
    char * json_str = cJSON_PrintUnformatted(json_obj);
    ESP_LOGI(TAG, "\n%s stringified length: %d\n", key, strlen(json_str));

    // free to avoid memory leaks!
    cJSON_free(json_str);
}

这显然不会考虑 cJSON 对象中的内部类型大小等,但应该是一个足够好的基准来突出显示一个选项是否明显优于另一个选项。

© www.soinside.com 2019 - 2024. All rights reserved.