c json实战引擎六 , 感觉还行
前言
看到六, 自然有 一二三四五 ...
为什么还要写呢. 可能是它还需要活着 : ) 挣扎升级中 .
上面代码也存在于下面项目中(维护的最及时)
这次版本升级 (2018-02-11). 做的工作如下
1. 修复了几个BUG
2. 优化了 value 解析
3. 优化了整体处理流程
随后会简单介绍做的工作
正文
1. 修复了几个BUG
介绍其中一个有意思的BUG, 关于 char 和 unsigned char 用法导致输出不一致.
#include <stdio.h> int main(void) {
char * p, * s = "你好"; p = s;
for (char c = *p; (c); c = *++p)
printf("\\u%04x", c);
putchar('\n'); p = s;
for (unsigned char c = *p; (c); c = *++p)
printf("\\u%04x", c);
putchar('\n'); return ;
}
最终输出结果 (Ubuntu 环境)
wzhi@wzc:~/heoo/sizeof$ gcc char.c ; ./a.out
\uffffffe4\uffffffbd\uffffffa0\uffffffe5\uffffffa5\uffffffbd
\u00e4\u00bd\u00a0\u00e5\u00a5\u00bd
wzhi@wzc:~/heoo/sizeof$
通过上面可以看出 char 多输出内容. 导致内存最终和我们的预期不一致.
还有些小 BUG, 不细说了, 留给有缘人赐予 wo 这样的人生机吧 ~ : )
2. 优化了 value 解析
value 分为 null, true, false, number, string, object, array 都有较多变化.
以 number 为例, 明显发现性能好了那么一盯点.
// number 分析
static const char * _parse_number(json_t item, const char * str) {
char c;
int sign = ;
double n = ;
int e, esign; // 正负号处理判断
if ((c = *str) == '-' || c == '+') {
sign = c == '-' ? - : ;
c = *++str;
} // 整数处理部分
while (c >= '' && c <= '') {
n = n * + c - '';
c = *++str;
}
// 处理小数部分
if (c == '.') {
int d = ;
double s = ;
while ((c = *++str) && c >= '' && c <= '') {
d = d * + c - '';
s *= 0.1;
}
// 得到整数和小数部分
n += s * d;
} // 添加正负号
n *= sign; // 不是科学计数内容直接返回
item->type = JSON_NUMBER;
if (c != 'e' && c != 'E') {
item->vald = n;
return str;
} // 处理科学计数法
if ((c = *++str) == '-' || c == '+')
++str;
esign = c == '-' ? - : ; e = ;
while ((c = *str) >= '' && c <= '') {
e = e * + c - '';
++str;
} // number = +/- number.fraction * 10^+/- exponent
item->vald = n * pow(, esign * e);
return str;
}
增强了通用性. 降低了运行的函数栈大小. 值得推荐参照.
其它优化多在于去除了冗余字符指针的移动 ......
3. 优化了整体处理流程
例如 value parse 中已经检查到 '"' or '[' or '{' ... 抛给对应的处理模块就不需要
再检查了. 整个流程是高度耦合. 性能好一点点.
以上就是我们当前做的操作. 整体而言. 当前这个 c json 库比 cJSON 库要清爽很多.
虽是换汤不换药. 但性能会好些. 更加精简适合学习者学习.
欢迎尝试 ~ 不忘初衷 ~
后记
错误是难免, 欢迎指正互相交流, 消磨时间~
(今天, 不太好, 祝福受伤的人. 哎, 到底怎么了 ~ 我们都生病了 - )
c json实战引擎六 , 感觉还行的更多相关文章
- c json实战引擎五 , 优化重构
引言 scjson是一个小巧的纯c跨平台小巧引擎. 适用于替换老的cJSON引擎的场景. 数据结构和代码布局做了大量改进.优势体现在以下几个方面: 1) 跨平台 (window 10 + VS2017 ...
- c json实战引擎四 , 最后❤跳跃
引言 - 以前那些系列 长活短说, 写的最终 scjson 纯c跨平台引擎, 希望在合适场景中替代老的csjon引擎, 速度更快, 更轻巧. 下面也是算一个系列吧. 从cjson 中得到灵感, 外加 ...
- C json实战引擎 三 , 最后实现部分辅助函数
引言 大学读的是一个很时髦的专业, 学了四年的游戏竞技. 可惜没学好. 但认真过, 比做什么都认真. 见证了 ...... 打的所有游戏人物中 分享一位最喜爱 的 “I've been alone ...
- C json实战引擎 二 , 实现构造部分
引言 这篇博文和前一篇 C json实战引擎一,实现解析部分设计是相同的,都是采用递归下降分析. 这里扯一点 假如你是学生 推荐一本书 给 大家 自制编程语言 http://baike.baidu.c ...
- C json实战引擎 一 , 实现解析部分
引言 以前可能是去年的去年,写了一个 c json 解析引擎用于一个统计实验数据项目开发中. 基本上能用. 去年在网上 看见了好多开源的c json引擎 .对其中一个比较标准的 cJSON 引擎 深入 ...
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- Javascript多线程引擎(六)
Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...
- 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间
极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...
- Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ
文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...
随机推荐
- 51nod 1574 排列转换(贪心+鸽巢原理)
题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,p ...
- 中小型园区网络的基本部署之动手划分vlan
在计算机网络中,一个二层网络可以被划分为多个不同的广播域,一个广播域对应了一个特定的用户组,默认情况下这些不同的广播域是相互隔离的.不同的广播域之间想要通信,需要通过一个或多个路由器.这样的一个广播域 ...
- Qt 多线程同步与通信
Qt 多线程同步与通信 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWrite ...
- unity3d点击屏幕选中物体
原文 http://blog.csdn.net/mycwq/article/details/19906335 前些天接触unity3d,想实现点击屏幕选中物体的功能.后来研究了下,实现原理就是检测从 ...
- 关于kali linux系统的简单工具
Linux系统中关于几个重要目录的原英文解释: /etc/: Contains configuration files of the installed tools /opt/: Contains M ...
- bzoj3884: 上帝与集合的正确用法(数论)
感觉是今天洛谷月赛T3的弱化版,会写洛谷T3之后这题一眼就会写了... 还是欧拉扩展定理 于是就在指数上递归%phi(p)+phi(p)直到1,则后面的指数就都没用了,这时候返回,边回溯边快速幂.因为 ...
- 【loj2639】[Tjoi2017]不勤劳的图书管理员
#2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- mac 的全文搜索
grep -Rni "view.proptypes.style" * 需要切换到要搜索的目录在运行
- python学习(十六)写爬虫爬取糗事百科段子
原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...