2010-12-09 25 views
5

Bạn có biết cách nào tốt nhất cho hiệu suất và bộ nhớ tiêu thụ không?json_encode/json_decode vs Zend_Json :: mã hóa/Zend_Json :: giải mã

Xin cảm ơn trước.

Tạm biệt.

+2

"Cách tốt nhất" là tự tìm hiểu vì điểm chuẩn có ý nghĩa nhất khi được thực hiện trong ứng dụng cụ thể thay vì một số môi trường bị cô lập. Vì vậy, lấy hồ sơ của bạn và thử. – Gordon

+0

Hôm nay, * Zend_Json * chỉ là [hàm bao bọc] (https://en.wikipedia.org/wiki/Wrapper_function) và ** thư viện không cần thiết **. 10 năm trước cũng là một [proxy có điều kiện] (https://en.wikipedia.org/wiki/Proxy_pattern) (một giải pháp cho việc thiếu các hàm tích hợp json cũ-PHP). –

Trả lời

4

Zend_Json ở đó để có thể tích hợp tốt hơn vào môi trường OO. Về hiệu suất, tôi nghĩ json_encode/decode sẽ nhanh hơn một chút, vì chúng được xây dựng trong các hàm (nghĩa là chúng không được viết bằng PHP).

+0

[Zend_Json sử dụng json_encode bên dưới; nó chỉ là một lớp để bạn có thể sử dụng nó tốt hơn trong một ứng dụng OO.] Bạn có chắc không? Tôi peeped vào Zend_Json_Encoder và không có bất kỳ json_encode chức năng vì vậy tôi nghĩ rằng zend json làm công việc. – Aly

+0

Thú vị, họ tự làm. Rõ ràng tôi đã sai về điều đó. Tôi sẽ sửa lại câu trả lời của mình. – Jonah

+1

@ Jonah Tôi đã cùng ấn tượng với bạn, sau đó bài viết của Aly khiến tôi có một cái nhìn tại nguồn và kỳ lạ đủ nó không bọc chức năng bản địa ... (Và tôi không thể nhìn thấy bất kỳ mã nào cho phép nó đến ...). Mỗi ngày đều là ngày đến trường! –

5
$memoryNativeStart = memory_get_peak_usage (true); 
$start = microtime(true); 
$native = json_decode(json_encode($data)); 
$memoryNative = memory_get_peak_usage (true) - $memoryNativeStart; 
$jsonNativeTime = microtime(true) - $start; 
$msgNative = 'Native php <br>'; 
$msgNative .= 'time '.$jsonNativeTime.' memory '.$memoryNative.'<br>'; 

echo $msgNative; 

sleep(3); 

$memoryZendStart = memory_get_peak_usage (true); 
$start = microtime(true); 
$zend = Zend_Json::decode(Zend_Json::encode($data)); 
$memoryZend = memory_get_peak_usage (true) - $memoryZendStart; 
$jsonZendTime = microtime(true) - $start; 
$msgZend = 'Zend <br>'; 
$msgZend .= 'time '.$jsonZendTime.' memory '.$memoryZend; 

echo $msgZend; 

bên trong dữ liệu có khoảng 130.000 hồ sơ (với một bộ kết quả)

tôi nhận được

Native php 

time 2.24236011505 memory 158072832 

Zend 

time 3.50552582741 memory 109051904 
+2

Mọi người nên nghiêm túc xem xét để làm thử nghiệm hiệu suất của riêng mình ở đây. 'Zend_Json' cũng sử dụng' json_encode' và 'json_decode', chỉ khi bạn bật' Zend_Json :: $ useBuiltinEncoderDecoder', bạn đo hiệu năng phi thực của thực thi, và điều này rất xấu (từ 6 đến 8x chậm hơn thông qua phép đo ở đây). –

+0

Và chỉ để công bằng, có một số trường hợp hiếm hoi mà bạn muốn không phải là người bản địa, ví dụ như bộ mã hóa/bộ giải mã gốc ném một số đầu vào UTF-8 "không tuân thủ" nhất định, như không được bảo vệ '\ 0'. Không biết nếu những điều này thậm chí là hợp pháp, nhưng 'Zend_Json' không bị nghẹt thở khi những người này và vui vẻ mã hóa/giải mã chúng. –

6

Sự khác biệt duy nhất ở chức năng là như sau (theo tài liệu Zend Framework):

Khi phương thức toJson() được thực hiện trên một đối tượng để mã hóa, Zend_Json gọi phương thức này và hy vọng đối tượng trả về một JSON đại diện cho trạng thái bên trong của nó.

Ngoài việc không có sự khác biệt và nó sẽ tự động chọn sử dụng chức năng json_encode của PHP nếu phần mở rộng json được cài đặt. Từ tài liệu của họ một lần nữa:

Nếu ext/json không được cài đặt triển khai khung Zend trong mã PHP được sử dụng để giải mã /. Điều này là chậm hơn đáng kể so với sử dụng phần mở rộng PHP, nhưng cư xử chính xác như nhau.

+1

Tôi cảm thấy sự phân biệt @ mylesmg khiến việc này rất quan trọng. Zend_Json :: mã hóa và Zend_Json :: giải mã ** là ** trong thực tế hàm bao hàm cho các hàm json_encode và json_decode gốc, ngoại trừ trong trường hợp mylesmsg đề cập đến mục mà bạn cố mã hóa là một đối tượng có phương thức toJson.Nếu bạn không chắc chắn rằng phiên bản PHP của môi trường là muộn hơn 5.2.0 (đây là khi JSON được thêm vào PHP Core), việc sử dụng Zend_Json sẽ thận trọng. Nhưng nếu không, nó sẽ là chi phí không cần thiết. PS: Xin lỗi nếu tôi đang hồi sinh một chủ đề cũ. Chỉ là câu hỏi nảy ra với đồng nghiệp của tôi. –

+0

Tôi đồng ý, kể từ 2006 Zend_Json "sẽ là phí không cần thiết" ... Nhưng phải nhấn mạnh, hôm nay, 10 năm sau (!), ** Zend_Json là phí không cần thiết **. –