simdjson_php 高速解析json

介绍

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

使用简介

  1. 当需要获取一个较大json串中的某个key时 使用simdjson_key_value() 是比较合适的,不像json_decode() 把整个json串解析成数组,开辟不必要的内存,当然在性能上是略逊于hash查找的。
  2. 当验证一个字符串是否为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"}]
  }
}
*/

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


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

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

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

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

//检查key是否存在,参数可以是一个json串也可以是一个json资源,返回true,false,null。当第一个参数是字符串时返回null代表解析失败
$res = simdjson_key_exists($jsonString, "Image\tIDs\t1");
var_dump($res) //bool(true)
$res = simdjson_key_exists($resource, "Image\tIDs\t1");
var_dump($res) //bool(true)

性能测试(秒)

filenamejson_decodesimdjson_decodesimdjson_isvalid
apache_builds.json0.003073000.002252000.00018100
canada.json0.139550000.027739000.00358300
citm_catalog.json0.030309000.013340000.00117000
github_events.json0.002941000.000904000.00008500
gsoc-2018.json0.042925000.011120000.00186700
instruments.json0.005097000.002318000.00017500
marine_ik.json0.098336000.044175000.00463400
mesh.json0.018692000.007226000.00114800
mesh.pretty.json0.035762000.007381000.00163400
numbers.json0.002636000.000699000.00018200
random.json0.017135000.009739000.00063000
twitter.json0.012586000.006184000.00057400
twitterescaped.json0.014359000.006504000.00074300
update-center.json0.015060000.008691000.00047800

You may run the benchmarks by running the commands:

  • php benchmark/benchmark.php
    原文作者:crazyxman
    原文地址: https://segmentfault.com/a/1190000019453872
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞