여기에서 결과를 확인하십시오 (JS 코드 상자에 PHP 코드를 넣는 해킹에 대해 죄송합니다).
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
결과 : serialize()
및 unserialize()
다양한 크기의 배열에 훨씬 빠르게 PHP 5.4의 상표입니다.
json_encode vs serialize와 json_decode vs unserialize를 비교하기 위해 실제 데이터에 대한 테스트 스크립트를 만들었습니다. 테스트는 프로덕션 전자 상거래 사이트의 캐싱 시스템에서 실행되었습니다. 단순히 캐시에있는 데이터를 가져 와서 모든 데이터를 인코딩 / 디코딩 (또는 직렬화 / 직렬화 해제)하는 시간을 테스트하여 쉽게 볼 수있는 테이블에 넣습니다.
PHP 5.4 공유 호스팅 서버에서 이것을 실행했습니다.
결과는 이러한 크고 작은 데이터 세트의 경우 직렬화 및 직렬화 해제가 확실한 승자라는 결론을 내 렸습니다. 특히 사용 사례의 경우 캐싱 시스템에서 json_decode 및 직렬화 해제가 가장 중요합니다. Unserialize는 거의 유비쿼터스 우승자였습니다. 일반적으로 json_decode의 2 ~ 4 배 (때로는 6 ~ 7 배) 빠릅니다.
@ peter-bailey의 결과 차이를 주목하는 것이 흥미 롭습니다.
결과를 생성하는 데 사용되는 PHP 코드는 다음과 같습니다.
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
function _count_depth($array)
{
$count = 0;
$max_depth = 0;
foreach ($array as $a) {
if (is_array($a)) {
list($cnt, $depth) = _count_depth($a);
$count += $cnt;
$max_depth = max($max_depth, $depth);
} else {
$count++;
}
}
return array(
$count,
$max_depth + 1,
);
}
function run_test($file)
{
$memory = memory_get_usage();
$test_array = unserialize(file_get_contents($file));
$memory = round((memory_get_usage() - $memory) / 1024, 2);
if (empty($test_array) || !is_array($test_array)) {
return;
}
list($count, $depth) = _count_depth($test_array);
//JSON encode test
$start = microtime(true);
$json_encoded = json_encode($test_array);
$json_encode_time = microtime(true) - $start;
//JSON decode test
$start = microtime(true);
json_decode($json_encoded);
$json_decode_time = microtime(true) - $start;
//serialize test
$start = microtime(true);
$serialized = serialize($test_array);
$serialize_time = microtime(true) - $start;
//unserialize test
$start = microtime(true);
unserialize($serialized);
$unserialize_time = microtime(true) - $start;
return array(
'Name' => basename($file),
'json_encode() Time (s)' => $json_encode_time,
'json_decode() Time (s)' => $json_decode_time,
'serialize() Time (s)' => $serialize_time,
'unserialize() Time (s)' => $unserialize_time,
'Elements' => $count,
'Memory (KB)' => $memory,
'Max Depth' => $depth,
'json_encode() Win' => ($json_encode_time > 0 && $json_encode_time < $serialize_time) ? number_format(($serialize_time / $json_encode_time - 1) * 100, 2) : '',
'serialize() Win' => ($serialize_time > 0 && $serialize_time < $json_encode_time) ? number_format(($json_encode_time / $serialize_time - 1) * 100, 2) : '',
'json_decode() Win' => ($json_decode_time > 0 && $json_decode_time < $serialize_time) ? number_format(($serialize_time / $json_decode_time - 1) * 100, 2) : '',
'unserialize() Win' => ($unserialize_time > 0 && $unserialize_time < $json_decode_time) ? number_format(($json_decode_time / $unserialize_time - 1) * 100, 2) : '',
);
}
$files = glob(dirname(__FILE__) . '/system/cache/*');
$data = array();
foreach ($files as $file) {
if (is_file($file)) {
$result = run_test($file);
if ($result) {
$data[] = $result;
}
}
}
uasort($data, function ($a, $b) {
return $a['Memory (KB)'] < $b['Memory (KB)'];
});
$fields = array_keys($data[0]);
?>
<table>
<thead>
<tr>
<?php foreach ($fields as $f) { ?>
<td style="text-align: center; border:1px solid black;padding: 4px 8px;font-weight:bold;font-size:1.1em"><?= $f; ?></td>
<?php } ?>
</tr>
</thead>
<tbody>
<?php foreach ($data as $d) { ?>
<tr>
<?php foreach ($d as $key => $value) { ?>
<?php $is_win = strpos($key, 'Win'); ?>
<?php $color = ($is_win && $value) ? 'color: green;font-weight:bold;' : ''; ?>
<td style="text-align: center; vertical-align: middle; padding: 3px 6px; border: 1px solid gray; <?= $color; ?>"><?= $value . (($is_win && $value) ? '%' : ''); ?></td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
</table>
JSON_UNESCAPED_UNICODE
.