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 ...
随机推荐
- Interviewe HDU - 3486( 暴力rmq)
面试n个人,可以分任意组数,每组选一个,得分总和严格大于k,问最少分几组 就是暴力嘛...想到就去写吧.. #include <iostream> #include <cstdio& ...
- 【BZOJ5306】[HAOI2018]染色(NTT)
[BZOJ5306]染色(NTT) 题面 BZOJ 洛谷 题解 我们只需要考虑每一个\(W[i]\)的贡献就好了 令\(lim=min(M,\frac{N}{S})\) 那么,开始考虑每一个\(W[i ...
- 使用 css 的 keyframe 实现 loading 动画
效果查看:https://jsfiddle.net/rubys/je16qL5k/6/ <!DOCTYPE html> <html lang="en"> & ...
- centos7 配置 yum 安装的 jdk
yum 安装的 java,jdk 路径默认是 /usr/lib/jvm/java-* 我们修改 .bash_profile 文件加上下面几行: export JAVA_HOME=/usr/lib/jv ...
- mysql5.7主从(Master/Slave)同步配置
环境: mysql版本都是5.7(以前的版本配置可能不一样) 主(Master) windows:192.168.0.68 从(Slave) centos7:192.168.0.4 基本环境配置: 要 ...
- UVA-10791 数学
UVA-10791 题意: 输入n (1<=n<2^31) 求至少两个正整数使得他们的lcm等于n并且他们的和最小,输出最小和 代码: // a*b=lcm*gcd => a=lcm ...
- source 导入文件
有时候,phpmyadmin 导入 是有大小限制的: 只可以用sql命令的source来导入文件
- 配置pdo 的用户和密码,
注意:要进入mysql命令行来操作~~~~ grant all on *.* to pdo_root@'%' identified by 'pdo_pwd'; flush privileges
- 垂直居中vertical-align
vertical-align对一些特定显示样式(例如单元格显示方式:table-cell)的元素才会起作用. div{display:table-cell; vertical-align:middle ...
- Distributed Systems 分布式系统
先来扯淡,几天是14年12月31日了,茫茫然,2014就剩最后一天了.这两天国大都放假,我给自己安排了四篇博客欠账,这就是其中的第一篇,简单介绍一些分布式系统的一些概念和设计思想吧.后面三篇分别是Ne ...