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 sebuah StdClass
instance (atau Object). Jika Anda perlu mengulanginya, mengubahnya menjadi sebuah array adalah apa yang mungkin akan Anda lakukan, dan ya itu meningkatkan waktu transformasi
waktu rata-rata: 780.2 ms; penggunaan memori: 41,5MB; ukuran file cache: 3.8MB
Msgpaket
@ Belanda menyebutkan msgpack . Situs web yang cantik. Mari kita coba.
waktu rata-rata: 497 ms; penggunaan memori: 32MB; ukuran file cache: 2.8MB
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.
waktu rata-rata: 411,4 ms; penggunaan memori: 36,75MB; ukuran file cache: 3.3MB
Lebih baik dari paket msg. Namun, ini juga membutuhkan kompilasi.
serialize
/unserialize
waktu rata-rata: 477.2 ms; penggunaan memori: 36.25MB; ukuran file cache: 5.9MB
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:
- IgBinary sangat bagus dan berkinerja lebih baik daripada MsgPack
- Msgpack lebih baik dalam mengompresi data Anda (perhatikan bahwa saya tidak mencoba opsi igbinary compact.string).
- Tidak mau dikompilasi? Gunakan standar.
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
JSON_UNESCAPED_UNICODE
.