优化 cJSON 库的 array 插入速度
和参考资料一样,我在我的项目中应用 cJSON 数组功能,发现在创建 array 的时候耗时很厉害(作为嵌入式 CPU,几十个 array 项的插入,居然花了 300ms)。搜了一下,网上已经有人遇到过了,就是参考资料的那篇。本文解释一下优化的思路和方法。 本文地址:http://www.52php.cn/article/p-vmgdyayj-d.html ReferencecJSON 库的使用和优化
修改方法下面左边是原版的 cJSON 代码,右边是修改后的,可以自己看看: void cJSON_AddItemToArray (cJSON *array,cJSON *item) | void cJSON_AddItemToArray (cJSON *array,cJSON *item) { | { cJSON *c = array->child; | cJSON *c = array->child; if (!item) | if (!item) return; | return; | if (!c) { | if (!c) { array->child=item; | array->child=item; | array->child->prev = item; } | } else { | else { while (c && c->next) | item->prev = array->child->prev; c=c->next; | array->child->prev->next = item; /* MARK */ suffix_object(c,item); | array->child->prev = item; | item->next = NULL; } | } | } | } 如果只单纯改上面这个函数的话(参考资料就只改了这点),实际上是会有 bug 的,那就是如果对一个使用 void cJSON_AddItemToArray(cJSON *array,cJSON *item) { cJSON *c = array->child; if (!item) { return; } if (!c) { /* list is empty,start new one */ array->child = item; array->child->prev = item; } else { /* append to the end */ if (array->child->prev) { item->prev = array->child->prev; array->child->prev->next = item; array->child->prev = item; item->next = NULL; } else { while (c->next) c = c->next; suffix_object(c,item); array->child->prev = item; } } }
修改思路原文提到两种修改方法,其实本质上是一模一样的。 THE END——实在是一个很不错的修改。我的操作时间从几百毫秒变成了30毫秒了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |