前言

  看到六, 自然有 一二三四五 ...

  为什么还要写呢.  可能是它还需要活着 : ) 挣扎升级中 .

  c json

  上面代码也存在于下面项目中(维护的最及时)

  structc 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实战引擎六 , 感觉还行的更多相关文章

  1. c json实战引擎五 , 优化重构

    引言 scjson是一个小巧的纯c跨平台小巧引擎. 适用于替换老的cJSON引擎的场景. 数据结构和代码布局做了大量改进.优势体现在以下几个方面: 1) 跨平台 (window 10 + VS2017 ...

  2. c json实战引擎四 , 最后❤跳跃

    引言  - 以前那些系列 长活短说, 写的最终 scjson 纯c跨平台引擎, 希望在合适场景中替代老的csjon引擎, 速度更快, 更轻巧. 下面也是算一个系列吧. 从cjson 中得到灵感, 外加 ...

  3. C json实战引擎 三 , 最后实现部分辅助函数

    引言 大学读的是一个很时髦的专业, 学了四年的游戏竞技. 可惜没学好. 但认真过, 比做什么都认真. 见证了  ...... 打的所有游戏人物中 分享一位最喜爱 的 “I've been alone ...

  4. C json实战引擎 二 , 实现构造部分

    引言 这篇博文和前一篇 C json实战引擎一,实现解析部分设计是相同的,都是采用递归下降分析. 这里扯一点 假如你是学生 推荐一本书 给 大家 自制编程语言 http://baike.baidu.c ...

  5. C json实战引擎 一 , 实现解析部分

    引言 以前可能是去年的去年,写了一个 c json 解析引擎用于一个统计实验数据项目开发中. 基本上能用. 去年在网上 看见了好多开源的c json引擎 .对其中一个比较标准的 cJSON 引擎 深入 ...

  6. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  7. Javascript多线程引擎(六)

    Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...

  8. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  9. Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ

    文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...

随机推荐

  1. 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp

    题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...

  2. BZOJ3598 SCOI2014方伯伯的商场之旅(数位dp)

    看到数据范围就可以猜到数位dp了.显然对于一个数最后移到的位置应该是其中位数.于是考虑枚举移到的位置,那么设其左边和为l,左右边和为r,该位置数为p,则需要满足l+p>=r且r+p>=l. ...

  3. [CTSC2012]熟悉的文章 后缀自动机

    题面:洛谷 题解: 观察到L是可二分的,因此我们二分L,然后就只需要想办法判断这个L是否可行即可. 因为要尽量使L可行,因此我们需要求出对于给定L,这个串最多能匹配上多少字符. 如果我们可以对每个位置 ...

  4. POJ.3894 迷宫问题 (BFS+记录路径)

    POJ.3894 迷宫问题 (BFS+记录路径) 题意分析 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, ...

  5. @RequestBody 和@ResponseBody 注解详解

    简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...

  6. BMP格式图像读取与存储

    全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...

  7. Hdu1542 Atlantis

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. NOIP2017

    NOIP2017游记 记得开始学OI是今年的6月,那时候纯粹是抱着好玩的心态来学的,但是渐渐地,我发现我好像喜欢上了OI,喜欢敲键盘时的声音,喜欢手指触碰键盘时的手感,喜欢这个奥赛班与其他科目学习气氛 ...

  9. isNaN与parseInt/parseFloat

    isNaN 返回一个 Boolean 值,指明提供的值是否是保留值 NaN (不是数字). NaN 即 Not a Number isNaN(numValue) 必选项 numvalue 参数为要检查 ...

  10. POJ 3304 Segments 基础线段交判断

    LINK 题意:询问是否存在直线,使得所有线段在其上的投影拥有公共点 思路:如果投影拥有公共区域,那么从投影的公共区域作垂线,显然能够与所有线段相交,那么题目转换为询问是否存在直线与所有线段相交.判断 ...