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 ...
随机推荐
- 【数据库_Postgresql】数据库主键自增长之加序列和不加序列2种方法
将表的主键进行序列增加之后可以在数据库层面自动主键id增长 方法如下:先建序列,然后建表关联id主键,然后添加语句,不用考虑id主键 DROP SEQUENCE IF EXISTS "pub ...
- [AT2557] [arc073_c] Ball Coloring
题目链接 AtCoder:https://arc073.contest.atcoder.jp/tasks/arc073_c 洛谷:https://www.luogu.org/problemnew/sh ...
- [洛谷P5190][COCI 2010] PROGRAM
题目大意:给你$k(k\leqslant10^6)$个数,$f(x)$表示$x$的约数在$k$个数中出现的次数,在这任何数都是$0$的约数.$m(m\leqslant10^6)$次询问,每次给出$l, ...
- Spring Boot系列教程八: Mybatis使用分页插件PageHelper
一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...
- bzoj3173
Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...
- 【HDU4471】Homework(矩阵快速幂)
[HDU4471]Homework(矩阵快速幂) 题面 Vjudge 给定一个数列的前\(m\)项,给定一个和前\(t\)项相关的递推式. 有\(q\)个位置的递推式单独给出,求数列第\(n\)项. ...
- 【CF700E】Cool Slogans(后缀自动机)
[CF700E]Cool Slogans(后缀自动机) 题面 洛谷 CodeForces 题解 构建后缀自动机,求出后缀树 现在有个比较明显的\(dp\) 设\(f[i]\)表示从上而下到达当前点能够 ...
- 【SPOJ】QTREE7(Link-Cut Tree)
[SPOJ]QTREE7(Link-Cut Tree) 题面 洛谷 Vjudge 题解 和QTREE6的本质是一样的:维护同色联通块 那么,QTREE6同理,对于两种颜色分别维护一棵\(LCT\) 每 ...
- 64位win10系统无法安装.Net framework3.5的两种解决方法【转】
近日有网友反映在windows10_64位系统电脑上安装Net framework3.5,操作时总失败,怎么办呢?小编下面就介绍win10 64位系统无法安装Net framework3.5的两种解决 ...
- Google Cast和ChromeCast
Google Cast类似于DLNA,AirPlayer,Miracast,就是一种投屏技术.我们ATV产品是对Google Cast和ChromeCast都是支持的. Google Cast 大致工 ...