时间戳转换工具

JSON

即JavaScript Object Notation,是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

serialize
它是php的一个方法,将变量序列化,返回一个具有变量类型和结构的字符串表达式。

igbinary
php序列化的一个代替方案,并未加入到php的标准库中。该序列话主要是对时间和空间消耗的文字表述,igbinary提供结构紧凑二进制形式。

msgpack
全程MessagePack,是一个基于二进制高效的对象序列化类库,可用于跨语言通信,它可以像JSON那样,在许多种语言之间交换结构对象,支持Python、Ruby、Java、C/C++等众多语言。


由于igbinary和msgpack不是php自带的,因此我们需要先进行安装。安装步骤略。


简单运行

为了便于了解它们的数据结构,编写测试代码,输出格式化后的数据。

<?php
$data = array( 'name' => 'Shy Song',
'age' => 25,
'country' => 'China'
);
$json_data = json_encode($data);
$serialize_data = serialize($data);
$igbinary_data = igbinary_serialize($data);
$msgpack_data = msgpack_pack($data);
print 'JSON: ' . $json_data;
print 'length: ' . strlen($json_data);
print 'serialize: ' . $serialize_data;
print 'length: ' . strlen($serialize_data);
print 'igbinary: ' . $igbinary_data;
print 'length: ' . strlen($igbinary_data);
print 'msgpack: ' . $msgpack_data;
print 'length: ' . strlen($msgpack_data);

输出结果如下:

JSON:
{"name":"Shy","age":25,"country":"China"}
length: 41
serialize:
a:3:{s:4:"name";s:3:"Shy";s:3:"age";i:25;s:7:"country";s:5:"China";}
length: 68
igbinary:
nameShyagecountryChina;
length: 40
msgpack:
��name�Shy�age�country�China
length: 29

可以看出,msgpack最短但不可读,serialize最长,json和igbinary长度差不多。注意,igbinary的实际数据比输出结果要长,只是不可显示。


性能对比

编写代码,对比不同数据转换所耗费的时间。
<?php
$info = array( 'name' => 'Shy',
'age' => 25,
'country' => 'China'
);
$data = array();
for($i = 0; $i < 1000; $i++)
{
$data[$i] = $info;
}
$time_start = microtime(true);
for($i = 0; $i < 10000; $i++)
{
$json_data = json_encode($data);
#$serialize_data = serialize($data);
#$igbinary_data = igbinary_serialize($data);
#$msgpack_data = msgpack_pack($data);
}
$time_end = microtime(true);
echo round($time_end - $time_start, 3);

得到的结果是,JSON 7.232秒,serialize 11.887秒,igbinary 1.156秒,msgpack 1.148秒。

通过以上对比,我们可以看到性能方面igbinary和msgpack远远优于JSON和serialize,且当面对深度的多维数组时,json和serialize的性能会大幅度下降。

总结

1. JSON是最为常用的、跨语言的数据传输方案,数据转换灵活,转换后的格式依旧保持清晰、可读,适用于通常情况下的数据传输。
2. serialize常用于方法、类的序列化,适用于在不同程序间进行函数的传输。
3. msgpack比JSON更快速也更轻巧,压缩后的数据格式会比json小,但是其可读性低,适用于对传输性能要求高且不关心数据格式的场景使用。比如配合gzcompress压缩函数,做商品的库存序列化数据缓存
4. igbinary为结构化数据,速度快,内存占用低,适用于memcached、redis等类似的基于内存的储量序列化的数据。

联系我们 - 首页 - 关于我们
Copyright © 2017-2022 iteam. All Rights Reserved. Current version is 2.50.0.
粤ICP备17021424号
VV:33980 UV:109967 PV:352134