json_encode / json_decode与Zend_Json::encode / Zend_Json::decode的区别

5

您知道什么是既能保证性能又能节省内存的最佳方法吗?

提前感谢。

再见。


2
“最好的方法”是自己找出来,因为基准测试在具体应用中进行时比在某个孤立环境中进行更有意义。所以拿出你的分析器并尝试一下吧。 - Gordon
今天的 Zend_Json 只是一个 包装函数,并且是一个 不必要的库开销。10年前它还是一个 条件代理(对于旧版PHP缺少json内置函数的一种解决方法)。 - Peter Krauss
3个回答

7
唯一的功能区别如下(根据Zend Framework文档):
当对要编码的对象实现toJson()方法时,Zend_Json会调用该方法并期望对象返回其内部状态的JSON表示形式。
除此之外,没有其他区别,并且如果安装了json扩展,它会自动选择使用PHP的json_encode功能。再次引用他们的文档:
如果未安装ext/json,则使用PHP代码中的Zend Framework实现进行en-/decoding。 这比使用PHP扩展要慢得多,但行为完全相同。

1
我认为@mylesmg所做的区分很重要。Zend_Json :: encode和Zend_Json :: decode实际上是本地json_encode和json_decode函数的包装器,除非您尝试编码的项目是具有toJson方法的对象,这是mylesmsg提到的情况。如果您不确定环境的PHP版本是否晚于5.2.0(这是将JSON添加到PHP Core的时间),则使用Zend_Json是明智的。但否则,这将是不必要的开销。 PS:如果我重新唤起了一个旧话题,请原谅。只是我的同事提出了这个问题。 - Jayawi Perera
我同意,自2006年起,Zend_Json“将是不必要的开销”……但是今天必须强调,10年后(!),Zend_Json是不必要的开销 - Peter Krauss

5
$memoryNativeStart = memory_get_peak_usage (true);
$start = microtime( true );
$native = json_decode(json_encode( $data ));
$memoryNative =  memory_get_peak_usage (true) - $memoryNativeStart;
$jsonNativeTime = microtime( true ) - $start;
$msgNative = 'Native php <br>';
$msgNative .= 'time '.$jsonNativeTime.' memory '.$memoryNative.'<br>';

echo $msgNative;

sleep(3);

$memoryZendStart = memory_get_peak_usage (true);
$start = microtime( true );
$zend = Zend_Json::decode(Zend_Json::encode( $data ));
$memoryZend =  memory_get_peak_usage (true) - $memoryZendStart;
$jsonZendTime = microtime( true ) - $start;
$msgZend = 'Zend <br>';
$msgZend .= 'time '.$jsonZendTime.' memory '.$memoryZend;

echo $msgZend;

数据内部有大约130,000条记录(带有结果集)

我得到:

Native php

time 2.24236011505 memory 158072832

Zend

time 3.50552582741 memory 109051904

2
每个人都应认真考虑在此进行自己的性能测试。Zend_Json 内部也使用 json_encodejson_decode,只有当您打开 Zend_Json::$useBuiltinEncoderDecoder 时,才能测量实现的非本地性能,而这非常非常糟糕(根据我们的测试,慢了6到8倍)。 - Thomas Keller
为了公平起见,有一些罕见的用例需要使用非本地编码,例如当本地编码器/解码器在处理某些“不符合”UTF-8输入时会抛出异常,比如未加防护的\0。我不知道这些是否合法,但是Zend_Json不会因此而出错,并且可以愉快地对它们进行编码/解码。 - Thomas Keller

4

Zend_Json的存在是为了更好地融入面向对象的环境中。至于性能,我认为json_encode/decode会稍微快一些,因为它们是内置函数(意味着它们不是用PHP编写的)。


Zend_Json 在底层使用了 json_encode;它只是一个层,因此您可以在面向对象的应用程序中更好地使用它。你确定吗?我瞥了一眼 Zend_Json_Encoder,并没有任何 json_encode 函数,所以我认为 zend json 完成了这项工作。 - Aly
有趣的是,他们自己做了。显然我对此错了。我会修改我的答案。 - Jonah
1
@Jonah 我和你一样的想法,然后看了Aly的帖子,让我查看源代码,奇怪的是它没有包装本地函数...(而且我看不到任何代码会允许它...)。每天都是一个学校日! - James Butler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接