资讯专栏INFORMATION COLUMN

simdjson_php 高速解析json

shadajin / 1704人阅读

摘要:介绍,它绑定来实现快速解析,是一个高速的解析器,它使用了大多数单一指令。介绍环境依赖带有的处理器即,年发布的微体系结构的处理器和年发布的微体系结构的处理器,大多数都是支持的最近的编译器例如,或或,我们假设。

介绍

simdjson_php(https://github.com/crazyxman/...,它绑定simdjson来实现快速解析,simdjson是一个高速的json解析器,它使用了大多数SIMD单一指令。simdjson介绍:https://github.com/lemire/sim...

环境依赖

php7+

带有AVX2的处理器(即,2013年发布的Haswell微体系结构的Intel处理器和2017年发布的Zen微体系结构的AMD处理器),大多数cpu都是支持的

最近的C ++编译器(例如,GNU GCC或LLVM CLANG或Visual Studio 2017),我们假设C ++ 17。GNU GCC 7或更高版本或LLVM的clang 6或更高版本

检查操作系统/处理器是否支持它:

OS X: sysctl -a | grep machdep.cpu.leaf7_features

Linux: grep avx2 /proc/cpuinfo

使用简介

当需要获取一个较大json串中的某个key时 使用simdjson_key_value() 是比较合适的,不像json_decode() 把整个json串解析成数组,开辟不必要的内存,当然在性能上是略逊于hash查找的。

当验证一个字符串是否为json时simdjson_isvaild() 是比较合适的,并且是非常快的,同样不需要通过json_decode()来验证。

//检查字符串是否为一个有效的json:
$isValid = simdjson_isvalid($jsonString); //return bool

//解析一个json字符串,返回数组,对象,null,类似json_decode(),第三个参数为解析的深度
$parsedJSON = simdjson_decode($jsonString, true, 512); //return array|object|null. "null" string is not a standard json

/*
{
  "Image": {
    "Width":  800,
    "Height": 600,
    "Title":  "View from 15th Floor",
    "Thumbnail": {
      "Url":    "http://www.example.com/image/481989943",
      "Height": 125,
      "Width":  100
    },
    "Animated" : false,
    "IDs": [116, 943, 234, 38793, {"p": "30"}]
  }
}
*/

//注意. "	" 是一个分割符. 它必须是一个控制字符. 它用来分割对象的key或数组的下标
//例如. "Image	Thumbnail	Url" 是正确. "Image	Thumbnail	Url" 是错误的


//根据json串获取指定key的值
$value = simdjson_key_value($jsonString, "Image	Thumbnail	Url");
var_dump($value); // string(38) "http://www.example.com/image/481989943"

$value = simdjson_key_value($jsonString, "Image	IDs	4", true);
var_dump($value); 
/*
array(1) {
  ["p"]=>
  string(2) "30"
}
*/

//获取json解析后的资源,只解析一次,后续使用不再解析
$resource = simdjson_resource($jsonString);
//根据json资源获取指定key的值
$value = simdjson_key_value($resource, "Image	Thumbnail	Url");
var_dump($value); // string(38) "http://www.example.com/image/481989943"

$value = simdjson_key_value($resource, "Image	IDs	4", true);
var_dump($value); 
/*
array(1) {
  ["p"]=>
  string(2) "30"
}
*/

//检查key是否存在,参数可以是一个json串也可以是一个json资源,返回true,false,null。当第一个参数是字符串时返回null代表解析失败
$res = simdjson_key_exists($jsonString, "Image	IDs	1");
var_dump($res) //bool(true)
$res = simdjson_key_exists($resource, "Image	IDs	1");
var_dump($res) //bool(true)
性能测试(秒)
filename json_decode simdjson_decode simdjson_isvalid
apache_builds.json 0.00307300 0.00225200 0.00018100
canada.json 0.13955000 0.02773900 0.00358300
citm_catalog.json 0.03030900 0.01334000 0.00117000
github_events.json 0.00294100 0.00090400 0.00008500
gsoc-2018.json 0.04292500 0.01112000 0.00186700
instruments.json 0.00509700 0.00231800 0.00017500
marine_ik.json 0.09833600 0.04417500 0.00463400
mesh.json 0.01869200 0.00722600 0.00114800
mesh.pretty.json 0.03576200 0.00738100 0.00163400
numbers.json 0.00263600 0.00069900 0.00018200
random.json 0.01713500 0.00973900 0.00063000
twitter.json 0.01258600 0.00618400 0.00057400
twitterescaped.json 0.01435900 0.00650400 0.00074300
update-center.json 0.01506000 0.00869100 0.00047800

You may run the benchmarks by running the commands:

php benchmark/benchmark.php

如有不足之处下方留言即可,欢迎大家批评指正,我会虚心接纳。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31707.html

相关文章

  • 简述CDN 什么是CDN 为什么要用CDN CDN适用场景

    摘要:用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。 考虑到对CDN认知程度的各层小伙伴,开头有必要简单介绍下CDN原理(高年级同学可以直接跳过): 一、CDN的基本原理和基础架构 CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布...

    番茄西红柿 评论0 收藏0
  • 简述CDN 什么是CDN 为什么要用CDN CDN适用场景

    摘要:用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。 考虑到对CDN认知程度的各层小伙伴,开头有必要简单介绍下CDN原理(高年级同学可以直接跳过): 一、CDN的基本原理和基础架构 CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布...

    didikee 评论0 收藏0
  • CyberPanel免费开源面板-高速LSCache免费SSL证书-可自建DNS和企业邮局

    摘要:是一个基于开发的服务器控制面板,支持高性能缓存,提供免费证书,可以一键签发证书,支持自建服务器,可以一键安装,你可以用它搭建服务器。关于的安装与使用早在年挖站否就已经分享过了免费服务器面板安装与使用,这几年发展越来越好了。CyberPanel是一个基于OpenLiteSpeed开发的服务器控制面板,支持LSCache高性能缓存,提供免费letsencrypt SSL证书,可以一键签发SSL证...

    番茄西红柿 评论0 收藏2637
  • Weex——关于移动端动态性的思考、实现和未来

    摘要:什么是动态性今天在移动端,尤其是像手机淘宝这样的中,动态性问题逐渐成为一个比较棘手的问题。在云端实现了天猫前端运营发布系统斑马的对接,在前端开发实现了主会场的界面模块和业务逻辑处理,同时在客户端上对接了手机天猫手机淘宝。 什么是动态性 今天在移动端,尤其是像手机淘宝这样的 App 中,动态性问题逐渐成为一个比较棘手的问题。所谓动态性,就是把移动应用本身的灵活性、迭代更新的周期和成本优化...

    heartFollower 评论0 收藏0

发表评论

0条评论

shadajin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<