博采众长,精于一技。Live for love, work for dream.
2010-04-19程序设计

igbinary vs serialize vs json_encode

最近看到memcached扩展支持额外的序列化方式 -- igbinary,这是一个未收录到pecl的php扩展,它提供的两个主要方法:

  • igbinary_serialize
  • igbinary_unserialize

据称可以用它来代替php自带的序列化函数serialize,性能更好,而且占用的字节数也更少。下面我就 igbinary ,serialize ,json_encode三者的性能做了一个简单的测试。

测试

以一个包含1000000个元素的数组做为原始数据,分别以json, serialize, igbinary进行序列化和反向操作。

ini_set('memory_limit', '512m');
$array = array_fill(0, 1000000, rand(1, 9999));
 
$start = microtime(true);
$export = json_encode($array);
$end = microtime(true);
$duration = $end - $start;
print('JSON Encode: ' . $duration . PHP_EOL);
 
$start = microtime(true);
$import = json_decode($export);
$end = microtime(true);
$duration = $end - $start;
print('JSON Decode: ' . $duration . PHP_EOL);
 
$start = microtime(true);
$export = serialize($array);
$end = microtime(true);
$duration = $end - $start;
print('Serialize: ' . $duration . PHP_EOL);
 
$start = microtime(true);
$import = unserialize($export);
$end = microtime(true);
$duration = $end - $start;
print('Serialize: ' . $duration . PHP_EOL);
 
$start = microtime(true);
$export = igbinary_serialize($array);
$end = microtime(true);
$duration = $end - $start;
print('Igbinary Serialize: ' . $duration . PHP_EOL);
 
$start = microtime(true);
$import = igbinary_unserialize($export);
$end = microtime(true);
$duration = $end - $start;
print('Igbinary Serialize: ' . $duration . PHP_EOL);

测试结果

JSON Encode: 0.084825992584229
JSON Decode: 0.34976410865784
Serialize: 0.38241410255432
Serialize: 7.7904229164124
Igbinary Serialize: 0.046916007995605
Igbinary Serialize: 0.23396801948547

从测试结果来看,速度方面优先级排列为 igbinary > json > serialize。同时我们也可以看到,php原生的serialize在对大对象进行反向操作时,速度真是掉队一大截了。

占用字节数对比

  • json: 5000001
  • serialize: 15888902
  • igbinary: 7868681

在没有中文字符的情况下,json胜出,igbinary次之,serialize又被甩了几条街。

一图顶千言

柱状图越矮小的性能越好

chart.png

原文地址:http://www.ooso.net/archives/538

日志信息 »

该日志于2010-04-19 09:58由 Rebill 发表在程序设计分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过评论 RSS订阅这个日志的所有评论。

相关日志 »

赞助链接 »

已有 6 条评论 »

  1. visvoy visvoy

    没鸟用的测试,没中文没gbk,json和ig序列化gbk中文数据必须得将gbk转成utf8,而serialize不需要,你抄的国外的比较,在国内没有任何意义

  2. Jison Jison

    事实上国内的也不见得全是gbk吧...我觉得既然能看出差别来,测试还是有意义的,顶楼主

    1. visvoy visvoy

      gbk在国内长时间还是主流,就像ie6人人喊打这么些年,仍然有巨大的市场份额
      你不可能无视国内仍以gbk为主流编码的大环境,国内的知名站点搜狐雅虎网易新浪
      清一色是gbk编码,他们是蛋疼吗?

      1. 那是历史遗留的原因。新的项目都采用UTF-8。

  3. visvoy visvoy

    你这个测试string里面加点中文,千八百字的,出来的结果就完全不同了!
    所以说在国内完全没有意义!

  4. webcgo webcgo

    序列化应该运行N篇取平均

添加新评论 »

返回顶部
无觅相关文章插件,快速提升流量