Saya perlu menyimpan array asosiatif multi-dimensi data dalam file datar untuk tujuan caching. Saya terkadang menemukan kebutuhan untuk mengubahnya ke JSON untuk digunakan di aplikasi web saya, tetapi sebagian besar waktu saya akan menggunakan array secara langsung di PHP. Apakah akan lebih efisien untuk menyimpan array sebagai JSON atau sebagai array serial PHP dalam file teks ini? Saya sudah melihat-lihat dan sepertinya dalam versi terbaru PHP (5.3), Saat ini saya condong ke arah penyimpanan array sebagai JSON karena saya merasa lebih mudah dibaca oleh manusia jika perlu, dapat digunakan dalam PHP dan JavaScript dengan sedikit usaha, dan dari apa yang saya baca, mungkin bahkan lebih cepat untuk memecahkan kode (meskipun tidak yakin tentang penyandian). Apakah ada yang tahu tentang jebakan? Adakah yang memiliki tolok ukur yang baik untuk menunjukkan manfaat kinerja dari kedua metode tersebut? Jawaban: 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
Dan mungkin ada beberapa perbedaan lain yang tidak dapat saya pikirkan saat ini. Tes kecepatan sederhana untuk membandingkan keduanya
JSON lebih sederhana dan lebih cepat daripada format serialisasi PHP dan harus digunakan kecuali :
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. Anda 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 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. 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". 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. 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 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
Msgpaket@ 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
Lebih baik dari paket msg. Namun, ini juga membutuhkan kompilasi. serialize/unserialize
Performa yang lebih baik daripada JSON, semakin besar arraynya, semakin lambat 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 Sepertinya serialisasi adalah yang akan saya gunakan karena 2 alasan:
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.
Saya membuat patokan kecil juga. Hasil saya sama. Tapi aku butuh kinerja decode. Di mana saya perhatikan, seperti beberapa orang di atas katakan juga, 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. Sebelum Anda membuat keputusan akhir, perhatikan bahwa format JSON tidak aman untuk array asosiatif -
Output adalah:
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. Lihat hasilnya di sini (maaf untuk peretasan yang menempatkan kode PHP di kotak kode JS): http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/ HASIL: 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:
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. 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. THX - untuk kode tolok ukur ini: Hasil saya pada array yang saya gunakan untuk konfigurasi adalah sebagai berikut: JSON disandikan dalam 0,0031511783599854 detik
Jadi - uji pada data Anda sendiri. 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 ... Saya akan
menyarankan Anda untuk menggunakan Super Cache, yang merupakan mekanisme cache file yang tidak akan menggunakan https://packagist.org/packages/smart-php/super-cache Ex:
|