Tergantung pada prioritas Anda.
Jika kinerja adalah karakteristik mengemudi mutlak Anda, maka tentu saja gunakan yang tercepat. Pastikan Anda memiliki pemahaman penuh tentang perbedaan sebelum Anda membuat pilihan
- Tidak seperti
serialize()
Anda perlu menambahkan parameter tambahan untuk menjaga agar karakter UTF-8 tidak tersentuh: json_encode($array, JSON_UNESCAPED_UNICODE)
(jika tidak, ia mengubah karakter UTF-8 ke urutan pelepasan Unicode).
- JSON tidak akan memiliki memori tentang apa kelas asli objek itu (mereka selalu dikembalikan sebagai instance dari stdClass).
- Anda tidak dapat memanfaatkan
__sleep()
dan __wakeup()
dengan JSON
- Secara default, hanya properti publik yang diserialisasi dengan JSON. (
PHP>=5.4
Anda dapat mengimplementasikan JsonSerializable untuk mengubah perilaku ini).
- JSON lebih portabel
Dan mungkin ada beberapa perbedaan lain yang tidak dapat saya pikirkan saat ini.
Tes kecepatan sederhana untuk membandingkan keduanya
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Make a big, honkin test array
// You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray(0, 5);
// Time json encoding
$start = microtime(true);
json_encode($testArray);
$jsonTime = microtime(true) - $start;
echo "JSON encoded in $jsonTime seconds\n";
// Time serialization
$start = microtime(true);
serialize($testArray);
$serializeTime = microtime(true) - $start;
echo "PHP serialized in $serializeTime seconds\n";
// Compare them
if ($jsonTime < $serializeTime) {
printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);
}
else if ($serializeTime < $jsonTime ) {
printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
echo "Impossible!\n";
}
function fillArray( $depth, $max ) {
static $seed;
if (is_null($seed)) {
$seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
}
if ($depth < $max) {
$node = array();
foreach ($seed as $key) {
$node[$key] = fillArray($depth + 1, $max);
}
return $node;
}
return 'empty';
}
JSON_UNESCAPED_UNICODE
.json_encode
) dan itu rata-rata sekitar 131% lebih cepat daripada cerita bersambung sekarang. Jadi, harus ada beberapa perbaikan yang cukup bagus untuk fungsi itu di 5.4.x lebih dari 5.3.x. Secara khusus, saya menjalankan 5.4.24 pada CentOS 6. Jadi, yay untuk JSON !!serialize() was roughly 35.04% faster than json_encode()
JSON lebih sederhana dan lebih cepat daripada format serialisasi PHP dan harus digunakan kecuali :
json_decode()
:: "Fungsi ini akan mengembalikan false jika data yang dikodekan JSON lebih dalam dari 127 elemen."sumber
Saya telah menulis posting blog tentang subjek ini:
" Cache a array besar: JSON, serialize atau var_export? ". Dalam posting ini ditunjukkan bahwa serialisasi adalah pilihan terbaik untuk array berukuran kecil hingga besar. Untuk array yang sangat besar (> 70MB) JSON adalah pilihan yang lebih baik.sumber
json_encode()
adalah sekitar 80% hingga 150% lebih cepat (itu benar-benar naik dan turun di sana) daripadaserialize()
, dengan sekitar 300 iterasi. Tetapi ketika menggunakan array yang lebih kecil (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
), saya melakukan tes dengan 750.000 iterasi danserialize()
sekitar 6% hingga 10% lebih cepat dalam kasus itu. Fungsi saya mengambil waktu rata-rata untuk semua iterasi dan membandingkannya. Saya mungkin mempostingnya di sini sebagai salah satu jawabanAnda mungkin juga tertarik dengan https://github.com/phadej/igbinary - yang menyediakan 'mesin' serialisasi yang berbeda untuk PHP.
Angka 'kinerja' saya yang acak / arbitrer, menggunakan PHP 5.3.5 pada platform 64bit:
JSON:
PHP asli:
Igbinary:
Jadi, lebih cepat untuk igbinary_serialize () dan igbinary_unserialize () dan menggunakan lebih sedikit ruang disk.
Saya menggunakan kode fillArray (0, 3) seperti di atas, tetapi membuat string array lebih panjang.
igbinary dapat menyimpan tipe data yang sama dengan serialize asli PHP (Jadi tidak ada masalah dengan objek, dll) dan Anda dapat memberitahu PHP5.3 untuk menggunakannya untuk penanganan sesi jika diinginkan.
Lihat juga http://ilia.ws/files/zendcon_2010_hidden_features.pdf - khusus slide 14/15/16
sumber
Y baru saja menguji serial dan json mengenkode dan mendekode, ditambah ukurannya akan mengambil string yang disimpan.
Kita dapat menyimpulkan bahwa JSON mengkodekan lebih cepat dan menghasilkan string yang lebih kecil, tetapi membatalkan registrasi lebih cepat untuk men-decode string.
sumber
Jika Anda menyimpan informasi yang pada akhirnya ingin Anda "sertakan" pada saatnya nanti, Anda mungkin ingin mencoba menggunakan var_export . Dengan begitu Anda hanya menerima hit di "serialize" dan bukan di "unserialize".
sumber
Saya menambah tes untuk memasukkan kinerja unserialisasi. Ini nomor yang saya dapat.
Jadi json sepertinya lebih cepat untuk encoding tetapi lambat dalam decoding. Jadi itu bisa bergantung pada aplikasi Anda dan apa yang paling Anda harapkan.
sumber
Topik yang sangat bagus dan setelah membaca beberapa jawaban, saya ingin membagikan eksperimen saya pada subjek.
Saya punya kasus penggunaan di mana beberapa tabel "besar" perlu ditanyakan hampir setiap kali saya berbicara dengan database (jangan tanya mengapa, hanya fakta). Sistem caching basis data tidak sesuai karena tidak akan men-cache permintaan yang berbeda, jadi saya berpikir tentang sistem caching php.
Saya mencoba
apcu
tetapi tidak sesuai dengan kebutuhan, memori tidak cukup dapat diandalkan dalam hal ini. Langkah selanjutnya adalah melakukan cache ke file dengan serialisasi.Tabel memiliki 14355 entri dengan 18 kolom, yaitu tes dan statistik saya tentang membaca cache serial:
JSON:
Seperti yang Anda semua katakan, ketidaknyamanan utama dengan
json_encode
/json_decode
adalah bahwa ia mengubah segalanya menjadi sebuahStdClass
instance (atau Object). Jika Anda perlu mengulanginya, mengubahnya menjadi sebuah array adalah apa yang mungkin akan Anda lakukan, dan ya itu meningkatkan waktu transformasiMsgpaket
@ Belanda menyebutkan msgpack . Situs web yang cantik. Mari kita coba.
Itu lebih baik, tetapi membutuhkan ekstensi baru; mengkompilasi orang yang terkadang takut ...
IgBinary
@GingerDog menyebutkan igbinary . Perhatikan bahwa saya telah mengaturnya
igbinary.compact_strings=Off
karena saya lebih peduli tentang kinerja pertunjukan daripada ukuran file.Lebih baik dari paket msg. Namun, ini juga membutuhkan kompilasi.
serialize
/unserialize
Performa yang lebih baik daripada JSON, semakin besar arraynya, semakin lambat
json_decode
, tetapi Anda sudah baru itu.Ekstensi eksternal itu mempersempit ukuran file dan tampak hebat di atas kertas. Angka tidak berbohong *. Apa gunanya mengkompilasi ekstensi jika Anda mendapatkan hasil yang hampir sama dengan fungsi PHP standar?
Kami juga dapat menyimpulkan bahwa tergantung pada kebutuhan Anda, Anda akan memilih sesuatu yang berbeda dari orang lain:
Itu saja, perbandingan metode serialisasi lain untuk membantu Anda memilih satu!
* Diuji dengan PHPUnit 3.7.31, php 5.5.10 - hanya decoding dengan hardrive standar dan CPU dual core lama - angka rata-rata pada 10 tes kasus penggunaan yang sama, statistik Anda mungkin berbeda
sumber
json_decode($object, true)
, pada dasarnya itu akan melakukan hal yang sama(array) json_decode($object)
tetapi secara rekursif sehingga akan menjadi perilaku yang sama dan itu akan memiliki biaya yang signifikan dalam kedua kasus. Perhatikan bahwa saya belum menguji perbedaan kinerja antaraStdClass
danarray
tapi itu bukan intinya di sini.Sepertinya serialisasi adalah yang akan saya gunakan karena 2 alasan:
Seseorang menunjukkan bahwa unserialize lebih cepat daripada json_decode dan case 'read' terdengar lebih mungkin daripada case 'write'.
Saya mengalami masalah dengan json_encode ketika memiliki string dengan karakter UTF-8 yang tidak valid. Ketika itu terjadi string berakhir menjadi kosong yang menyebabkan hilangnya informasi.
sumber
Saya telah menguji ini dengan sangat teliti pada hash multi-hash yang cukup kompleks, dengan semua jenis data di dalamnya (string, NULL, integer), dan serialisasi / unserialize berakhir jauh lebih cepat daripada json_encode / json_decode.
Satu-satunya keuntungan yang dimiliki json dalam pengujian saya adalah ukurannya yang 'lebih kecil'.
Ini dilakukan di PHP 5.3.3, beri tahu saya jika Anda ingin lebih detail.
Berikut adalah hasil tes kemudian kode untuk memproduksinya. Saya tidak bisa memberikan data tes karena itu akan mengungkapkan informasi yang saya tidak bisa lepaskan di alam liar.
sumber
Saya membuat patokan kecil juga. Hasil saya sama. Tapi aku butuh kinerja decode. Di mana saya perhatikan, seperti beberapa orang di atas katakan juga,
unserialize
lebih cepat daripadajson_decode
.unserialize
membutuhkan sekitar 60-70% darijson_decode
waktu. Jadi kesimpulannya cukup sederhana: Ketika Anda membutuhkan kinerja dalam encoding, gunakanjson_encode
, ketika Anda membutuhkan kinerja saat decoding, gunakanunserialize
. Karena Anda tidak dapat menggabungkan dua fungsi, Anda harus membuat pilihan di mana Anda memerlukan lebih banyak kinerja.Tolok ukur saya dalam semu:
Rata-rata: unserialize menang 96 kali lebih dari 4 kali json_decode. Dengan rata-rata sekitar 1,5 ms lebih dari 2,5 ms.
sumber
Sebelum Anda membuat keputusan akhir, perhatikan bahwa format JSON tidak aman untuk array asosiatif -
json_decode()
sebagai gantinya akan mengembalikannya sebagai objek:Output adalah:
sumber
json_encode
adalah array asosiatif, Anda dapat dengan mudah memaksanya kembali ke dalam array seperti:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
Juga baik untuk dicatat bahwa Anda dapat mengakses objek dengan cara yang sama seperti array dalam PHP sehingga dalam skenario yang khas, orang bahkan tidak akan tahu bedanya. Poin yang bagus!Pertama, saya mengubah skrip untuk melakukan lebih banyak pembandingan (dan juga melakukan 1.000 kali alih-alih hanya 1):
Saya menggunakan versi PHP 7 ini:
Dan hasil saya adalah:
Jadi jelas , serialize / unserialize adalah metode tercepat , sedangkan json_encode / decode adalah yang paling portabel.
Jika Anda mempertimbangkan skenario di mana Anda membaca / menulis data serial 10x atau lebih sering daripada yang perlu Anda kirim atau terima dari sistem non-PHP, Anda MASIH lebih baik menggunakan serialisasi / unserialize dan memilikinya json_encode atau json_decode sebelum serialisasi dalam hal waktu.
sumber
Lihat hasilnya di sini (maaf untuk peretasan yang menempatkan kode PHP di kotak kode JS):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
HASIL:
serialize()
danunserialize()
keduanya secara signifikan lebih cepat di PHP 5.4 pada array dengan ukuran yang bervariasi.Saya membuat skrip uji pada data dunia nyata untuk membandingkan json_encode vs serialize dan json_decode vs unserialize. Tes dijalankan pada sistem caching dari situs e-commerce produksi. Ini hanya mengambil data yang sudah ada dalam cache, dan menguji waktu untuk menyandikan / mendekode (atau membuat serial / unserialize) semua data dan saya memasukkannya ke dalam tabel yang mudah dilihat.
Saya menjalankan ini di server hosting bersama PHP 5.4.
Hasilnya sangat konklusif bahwa untuk kumpulan data besar hingga kecil ini serialisasi dan unserialize adalah pemenang yang jelas. Khususnya untuk kasus penggunaan saya, json_decode dan unserialize adalah yang paling penting untuk sistem caching. Unserialize hampir menjadi pemenang di mana-mana di sini. Itu biasanya 2 hingga 4 kali (kadang-kadang 6 atau 7 kali) secepat json_decode.
Sangat menarik untuk mencatat perbedaan hasil dari @ peter-bailey.
Berikut adalah kode PHP yang digunakan untuk menghasilkan hasil:
sumber
just an fyi - jika Anda ingin membuat cerita bersambung data Anda ke sesuatu yang mudah dibaca dan dipahami seperti JSON tetapi dengan lebih banyak kompresi dan kinerja yang lebih tinggi, Anda harus memeriksa paket pesan.
sumber
JSON lebih baik jika Anda ingin membuat cadangan data dan memulihkannya di mesin lain atau melalui FTP.
Misalnya dengan membuat cerita bersambung jika Anda menyimpan data di server Windows, mengunduhnya melalui FTP dan mengembalikannya ke Linux yang tidak dapat berfungsi lagi karena pengkodean ulang charachter, karena membuat cerita bersambung menyimpan panjang string dan dalam Unicode > UTF-8 transcoding beberapa charachter 1 byte bisa menjadi 2 byte membuat algoritma crash.
sumber
THX - untuk kode tolok ukur ini:
Hasil saya pada array yang saya gunakan untuk konfigurasi adalah sebagai berikut: JSON disandikan dalam 0,0031511783599854 detik
PHP yang diserialkan dalam 0,0037961006164551 detik
json_encode()
kira-kira 20,47% lebih cepat daripadaserialize()
JSON yang disandikan dalam 0,0070841312408447 detikPHP yang diserialkan dalam 0,0035839080810547 detik
unserialize()
lebih cepat 97,66% daripadajson_encode()
Jadi - uji pada data Anda sendiri.
sumber
Jika untuk meringkas apa yang orang katakan di sini, json_decode / encode tampaknya lebih cepat daripada membuat serial / unserialize TETAPI Jika Anda melakukan var_dump jenis objek serial diubah. Jika karena alasan tertentu Anda ingin tetap menggunakan tipe ini, gunakan serialize!
(coba misalnya stdClass vs array)
cerita bersambung / terbongkar:
json encode / decode
Seperti yang Anda lihat, json_encode / decode mengubah semua menjadi stdClass, yang tidak terlalu bagus, info objek hilang ... Jadi putuskan berdasarkan kebutuhan, terutama jika bukan hanya array ...
sumber
Saya akan menyarankan Anda untuk menggunakan Super Cache, yang merupakan mekanisme cache file yang tidak akan menggunakan
json_encode
atauserialize
. Ini mudah digunakan dan sangat cepat dibandingkan dengan mekanisme PHP Cache lainnya.https://packagist.org/packages/smart-php/super-cache
Ex:
sumber