Chủ đề thực sự hay và sau khi đọc một vài câu trả lời, tôi muốn chia sẻ thí nghiệm của mình về chủ đề này.
Tôi có một trường hợp sử dụng trong đó một số bảng "khổng lồ" cần được truy vấn gần như mỗi lần tôi nói chuyện với cơ sở dữ liệu (đừng hỏi tại sao, chỉ là sự thật). Hệ thống bộ đệm cơ sở dữ liệu không phù hợp vì nó sẽ không lưu trữ các yêu cầu khác nhau, vì vậy tôi nghĩ về các hệ thống bộ đệm php.
Tôi đã thử apcu
nhưng nó không phù hợp với nhu cầu, bộ nhớ không đủ tin cậy trong trường hợp này. Bước tiếp theo là lưu trữ vào một tệp có tuần tự hóa.
Bảng có 14355 mục với 18 cột, đó là các bài kiểm tra và số liệu thống kê của tôi về việc đọc bộ đệm được tuần tự hóa:
JSON:
Như bạn đã nói, sự bất tiện lớn với json_encode
/ json_decode
là nó biến đổi mọi thứ thành một StdClass
thể hiện (hoặc Object). Nếu bạn cần lặp nó, chuyển đổi nó thành một mảng là điều bạn có thể làm, và vâng, nó sẽ tăng thời gian chuyển đổi
thời gian trung bình: 780,2 ms; sử dụng bộ nhớ: 41,5 MB; kích thước tệp bộ nhớ cache: 3,8 MB
Msgpack
@hutch đề cập đến gói tin . Trang web đẹp. Chúng ta hãy thử xem?
thời gian trung bình: 497 ms; sử dụng bộ nhớ: 32MB; kích thước tệp bộ nhớ cache: 2,8 MB
Điều đó tốt hơn, nhưng đòi hỏi một phần mở rộng mới; biên dịch đôi khi sợ mọi người ...
IgBinary
@GingerDog đề cập đến igbinary . Lưu ý rằng tôi đã đặt igbinary.compact_strings=Off
vì tôi quan tâm nhiều hơn đến việc đọc hiệu suất hơn kích thước tệp.
thời gian trung bình: 411,4 ms; sử dụng bộ nhớ: 36,75 MB; kích thước tệp bộ nhớ cache: 3,3 MB
Tốt hơn gói tin nhắn. Tuy nhiên, cái này đòi hỏi phải biên dịch quá.
serialize
/unserialize
thời gian trung bình: 477,2 ms; sử dụng bộ nhớ: 36,25MB; kích thước tệp bộ nhớ cache: 5,9 MB
Hiệu suất tốt hơn JSON, mảng càng lớn, chậm hơn json_decode
, nhưng bạn đã làm được điều đó.
Những phần mở rộng bên ngoài đang thu hẹp kích thước tệp và có vẻ tuyệt vời trên giấy. Số không nói dối *. Điểm biên dịch một phần mở rộng là gì nếu bạn nhận được gần như cùng kết quả mà bạn có với một hàm PHP tiêu chuẩn?
Chúng tôi cũng có thể suy luận rằng tùy thuộc vào nhu cầu của bạn, bạn sẽ chọn một cái gì đó khác với người khác:
- IgBinary thực sự tốt và hoạt động tốt hơn MsgPack
- Msgpack tốt hơn trong việc nén dữ liệu của bạn (lưu ý rằng tôi đã không thử tùy chọn igbinary compact.opes).
- Không muốn biên dịch? Sử dụng tiêu chuẩn.
Đó là nó, một phương pháp so sánh nối tiếp khác để giúp bạn chọn một phương pháp!
* Đã thử nghiệm với PHPUnit 3.7.31, php 5.5.10 - chỉ giải mã với CPU lõi cứng tiêu chuẩn và CPU lõi kép cũ - số trung bình trên 10 bài kiểm tra trường hợp sử dụng giống nhau, số liệu thống kê của bạn có thể khác
JSON_UNESCAPED_UNICODE
.