开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3189|回复: 252
收起左侧

[易语言纯源码] 【开源】ZJSON v1.2 易语言 JSON 性能天花板

  [复制链接]
回帖奖励 184 枚 精币 回复本帖可获得 1 枚 精币奖励! 每人限 1 次(中奖概率 50 %)
结帖率:100% (3/3)
发表于 6 天前 | 显示全部楼层 |阅读模式   重庆市重庆市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
本次 ZJSON V1.2 的更新,主要针对 1.1 版本发布后各位易友反馈的实际业务场景与使用体验,进行了底层的深度优化与重构

【ZJSON V1.2 更新日志】
1. 新增 汇编级读写锁 (SRWLock) 引擎:
  • 全面升级底层并发模型,由自旋锁 (SpinLock) 替换为 Windows 原生读写锁。实现彻底的“读写分离”,多线程并发cha询操作(取文本、取整数等)完全无锁阻塞;同时通过底层追踪 ThreadID 与 LockCount,包裹出支持可重入递归的特性,极限提升多线程吞吐量。

2. 新增 智能自适应双向转码:
  • 引入纯汇编 SIMD 级 ASCII 探测器(Asm_Is_Pure_ASCII)。在节点读写、文本载入时,底层自动识别字符集并无缝完成 ANSI 与 UTF-8 的极速双向转码,彻底解决易语言环境下的中文乱码与字符截断问题。

3. 新增 数组顺序遍历智能缓存(Query Cache):
  • 针对计次循环读取大型 JSON 数组的场景,在底层新增游标级上下文记忆。系统自动记录上一次访问的数组jz与索引下标,顺序递增读取时直接从缓存指针步进偏移,将遍历耗时从 O(N²) 直接降维至 O(1)。

4. 优化 路径解析与节点定位逻辑:
  • 重构底层路由,统一使用 _内部_路径cha询 进行查表分发;新增 Asm_HashMap_Get_Array_Tail 汇编接口极速定位数组末尾,进一步压榨高频数组追加(加入成员系列)的执行周期。

5. 新增 读前双重检查锁定 (DCL) 机制:
  • cha询接口引入 _读前检查索引 机制,在共享读锁环境下安全探测索引脏标记(IsDirty)。仅当发现底层结构变更时,才平滑升级为独占写锁重建哈希表,最大限度降低并发环境下的锁争用。

6.修复 复杂键名构建时的字面量转义隐患:
  • 在 _智能构建缺失树 逻辑中,新增 _脱除字面量转义 容错处理。精准剥离多级路径包裹的引号和转义符,提升非标准路径或特殊字符键名创建时的容错率。





【模块简介】
ZJSON 是一款专为高并发与海量数据场景打造的工业级 JSON 解析与构建引擎。通过对 x86 汇编的深度重构与底层内存架构的颠覆性创新,它成功打破了 32 位环境的物理桎梏。以常态稳定 600~720MB/s 的解析吞吐量和近 500 万次 Ops/s 的读写极速,正式将易语言的 JSON 处理能力推入全球顶尖梯队(跻身 T1 级别,性能直接比肩 C++ 工业标杆 RapidJSON,远超 V8 引擎与 Go 原生库,更是对易语言常规第三方模块形成了几十倍的降维打击)。它不仅是一台跑分无敌的“性能怪兽”,更在极客级别的底层中,融入了如同 JavaScript 般丝滑的现代化开发体验。

【核心技术特性】
  • 汇编级降维打击与惰性扁平流 (Lazy Flat-Buffer)
    全面抛弃传统臃肿的 DOM 多叉树结构!数据在内存中保持连续字节流,依靠纯 FASM 汇编指令、SSE2 向量化以及硬件级 CRC32 哈希进行极速寻址。对于大型数组支持零拷贝 (Zero-Copy) 裸指针级提速,消除字符串申请开销。


  • 极致并发:SRW 读写锁与 DCL 机制 (Concurrent SRWLock)
    引入 Windows 原生级 SRWLock(读写锁)并包裹实现可重入递归支持。结合读前双重检查锁定 (DCL),实现彻底的“读写分离”,在多线程狂暴交叉读写、乱序抹除的极端压测下,依然保证哈希精准、死锁率为 0。


  • 突破性的 O(1) 内存复用与游标缓存 (Space Filling & Smart Cache)
    首创“预留空洞”与“Ghost Node (软删除)”机制,95% 的节点更新直接在物理内存中原地覆盖。同时针对大型数组遍历,底层植入上下文游标智能缓存,连续追加或递增读取时直接跳跃寻址,将时间复杂度从 O(N²) 暴力降维至 O(1)。


  • JS 级智能结构补全 (Auto-vivification)
    写 JSON 从未如此优雅!自带智能路径编译器,只需简单一句 KV.置文本 ("data.users[0].profile.age", "18"),引擎即可无视数组越界与节点缺失,安全、自动、一次性补全所有前置父节点。告别繁琐的判断代码,实现“点哪创哪”。


  • 全自动无缝智能转码 (Adaptive Encoding)
    底层集成纯汇编 SIMD 级 ASCII 探测,智能识别数据源,在 ANSI (GBK) 与 UTF-8 之间进行极速、无感知的双向无损转码,并支持复杂的 Emoji 代理对完美还原。



游客,如果您要查看本帖隐藏内容请回复


点评

如果大家有什么好的想法、建议,或者在运行/使用过程中遇到了问题,欢迎在评论区留言反馈。我会在后续的版本中进行优化。   重庆市重庆市  发表于 6 天前

评分

参与人数 16好评 +7 精币 +21 收起 理由
陈大奶么么哒 + 1 + 2 YYDS~!
kyo9766 + 1 感谢分享,很给力!~
jiang910615 + 1 + 2 支持开源~!感谢分享
caoljie + 1 + 3 开源精神必须支持~
chuanqibuding + 1 感谢分享
wuqingg + 1 + 1 支持开源~!感谢分享
sdwyyan + 1 支持开源~!感谢分享
cbl521ysys + 1 感谢分享,很给力!~
枷锁 + 1 + 2 新技能已get√
恒大大 + 1 感谢分享,很给力!~
文西哥 + 1 感谢分享,很给力!~
xhping + 1 感谢分享,很给力!~
szxiao + 1 + 2 感谢分享,很给力!~
风雨3137 + 1 感谢分享,很给力!~
cui870222829 + 1 感谢分享,很给力!~
zjbin1989 + 1 感谢分享,很给力!~

查看全部评分


结帖率:100% (3/3)

签到天数: 23 天

 楼主| 发表于 3 天前 | 显示全部楼层   重庆市重庆市
本帖最后由 z573277679 于 2026-6-20 22:40 编辑
不苦小和尚 发表于 2026-6-20 17:33
这个版本用你上次开源的精易助手,解析到树中文乱码,用1.1版本正常,什么问题 ...

如果有使用到上次开源的精易助手替换 窗口程序集_JSON窗口 中的 快速ZJSON_创建条目 子程序即可。这并不是BUG,而是因为1.1版本使用的是ANSI 内存。而1.2版本为了安全、高效做了底层重构。1.2的核心引擎(ZNode)被重构为纯净的 UTF-8 内存。
为什么需要手动转码:其实ZJSON本身的常规 API(比如 取文本)内部是自带智能转码的,平时用根本不需要手动转。 但精易网页助手为了树型框的秒级渲染,采用的是越级底层调用 —— 直接用 Asm_JSON_Iterate 迭代器去取内存裸指针。这种极速模式刻意绕过了高级API的包装损耗,所以你拿到的是最原生的UTF-8指针,在塞给易语言 UI 显示前,手动套一层 编码_Utf8到Ansi 就是正确、性能最高的做法。

  
子程序名返回值类型公开备 注
快速ZJSON_创建条目  
参数名类 型参考可空数组备 注
参_路径文本型
参_节点指针整数型
参_节点长度整数型
参_等级整数型
参_是数组逻辑型
变量名类 型静态数组备 注
IterPtr整数型 
EndPtr整数型 
KeyPtr整数型 
KeyLen整数型 
ValPtr整数型 
ValLen整数型 
节点类型整数型 
循环索引整数型 
键名文本型 
摘要文本型 
新路径文本型 
显示名文本型 
EndPtr = 参_节点指针 + 参_节点长度
IterPtr = 参_节点指针 + 1
循环索引 = 0
判断循环首 ()
IterPtr = Asm_JSON_Iterate (IterPtr, EndPtr, KeyPtr, KeyLen, ValPtr, ValLen, 参_是数组)
如果真 (IterPtr = 0)
跳出循环 ()

节点类型 = Asm_Get_Type_Fast (ValPtr, ValLen)
如果 (参_是数组)
键名 = “[”到文本 (循环索引)“]”
新路径 = 选择 (参_路径 = “”, 键名, 参_路径 + 键名)
如果 (KeyLen > 0)
键名 = 集_ZJSON.编码_Utf8到Ansi (指针到字节集 (KeyPtr, KeyLen))
键名 = “”
新路径 = 选择 (参_路径 = “”, 键名, 参_路径 + “.” + 键名)

如果 (节点类型 = 4)  ' 文本型
摘要 = 集_ZJSON.编码_Utf8到Ansi (指针到字节集 (ValPtr, ValLen))
如果真 (取文本长度 (摘要) > 100)
摘要 = 取文本左边 (摘要, 100)“...”#引号

如果 (节点类型 = 6 节点类型 = 5)  ' 对象或数组,无需摘要
摘要 = “”
摘要 = 集_ZJSON.编码_Utf8到Ansi (指针到字节集 (ValPtr, ValLen))


' 将构建好的节点送入树缓冲
判断 (节点类型 = 6)  ' 对象
显示名 = 键名 + “: [Object]”
树缓冲_加入节点 (显示名, 0, 0, 参_等级 + 1, 新路径)
快速ZJSON_创建条目 (新路径, ValPtr, ValLen, 参_等级 + 1, )
判断 (节点类型 = 5)  ' 数组
显示名 = 键名 + “: [Array]”
树缓冲_加入节点 (显示名, 2, 2, 参_等级 + 1, 新路径)
快速ZJSON_创建条目 (新路径, ValPtr, ValLen, 参_等级 + 1, )
显示名 = 键名 + “: ” + 摘要
树缓冲_加入节点 (显示名, 1, 1, 参_等级 + 1, 新路径)

循环索引 = 循环索引 + 1
判断循环尾 ()



回复 支持 反对

使用道具 举报

结帖率:53% (19/36)

签到天数: 12 天

发表于 3 小时前 | 显示全部楼层   四川省达州市
您要查看本
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 3 天

发表于 5 小时前 | 显示全部楼层   安徽省阜阳市
666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 5 小时前 | 显示全部楼层   广西壮族自治区柳州市

回帖奖励 +1 枚 精币

感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 11 天

发表于 昨天 23:08 | 显示全部楼层   湖南省岳阳市
感谢楼主分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 4 天

发表于 昨天 22:57 | 显示全部楼层   湖北省黄石市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)
发表于 昨天 22:44 | 显示全部楼层   湖南省益阳市
  感谢分享   感谢分享
回复 支持 反对

使用道具 举报

签到天数: 16 天

发表于 昨天 21:34 | 显示全部楼层   湖北省武汉市

感谢分享
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)

签到天数: 12 天

发表于 昨天 18:14 | 显示全部楼层   江苏省镇江市
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 昨天 16:21 | 显示全部楼层   云南省红河哈尼族彝族自治州
        感谢分享,很给力!~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表