2012-08-06 54 views
10

Tôi đang thử nghiệm SplFixedArray xây dựng một mảng với những ngày trong tuần, và tôi nhận được kết quả như sau:Thực sự SplFixedArray có hoạt động tốt hơn mảng không?

<?php 

$days = new SplFixedArray(7); 

$days[0] = "Monday"; 
$days[1] = "Tuesday"; 
$days[2] = "Wednesday"; 
$days[3] = "Thursday"; 
$days[4] = "Friday"; 
$days[5] = "Saturday"; 
$days[6] = "Sunday"; 

echo memory_get_peak_usage() . "\n"; //Returns 327688 
echo memory_get_usage() . "\n"; //Returns 327140 
echo memory_get_peak_usage(true) . "\n"; //Returns 524288 
echo memory_get_usage(true) . "\n"; //Returns 524288 

Với mảng truyền thống:

<?php 

$days = array(); 

$days[0] = "Monday"; 
$days[1] = "Tuesday"; 
$days[2] = "Wednesday"; 
$days[3] = "Thursday"; 
$days[4] = "Friday"; 
$days[5] = "Saturday"; 
$days[6] = "Sunday"; 

echo memory_get_peak_usage() . "\n"; //Returns 327528 
echo memory_get_usage() . "\n"; //Returns 326820 
echo memory_get_peak_usage(true) . "\n"; //Returns 524288 
echo memory_get_usage(true) . "\n"; //Returns 524288 

Liệu nó có ý nghĩa đối với bạn?

+0

đối tượng và mảng tạo của bạn ... những gì bạn muốn ??? – voodoo417

+3

Mảng có thể quá nhỏ để đánh giá cao sự khác biệt. Hãy thử benchmarking mảng lớn hơn, đó là những gì SplFixedArray là cho anyway. – Mahn

Trả lời

16

Như được minh họa bởi các tiêu chuẩn thực hiện bởi tác giả của this article:

http://www.johnciacia.com/wp-content/uploads/2011/01/3.png

Người ta có thể kết luận rằng bộ nhớ của SplFixedArray là thực sự nhỏ hơn, nhưng đáng chú ý chỉ cho một số lượng lớn thành phần mảng. Bởi vì SplFixedArray về mặt kỹ thuật giống như các mảng truyền thống, đó là những gì gây ra các mảng nhỏ thực sự tốn nhiều bộ nhớ hơn nếu được thực hiện bởi SplFixedArray, nhưng vì vài trăm byte này vẫn không đổi, nó trở nên không liên quan như kích thước của mảng phát triển.

Lưu ý phụ: không tối ưu hóa vi mô, không phải mọi búa được tạo cho mọi móng tay. SplFixedArray có trường hợp cực đoan, ví dụ: đối với mảng hàng trăm nghìn phần tử, trong đó cắt giảm một vài byte sử dụng bộ nhớ trên mỗi phần tử có tác động lớn đến việc sử dụng bộ nhớ tổng thể; nhưng đừng bận tâm sử dụng nó trừ khi bạn thực sự chắc chắn mảng của bạn là hoặc có thể là một nút cổ chai tiềm năng của ứng dụng.

9

SplFixedArray được cho là nhanh hơn mảng. Nó không nói bất cứ điều gì về tiêu thụ bộ nhớ (đó là những gì bạn đang thử nghiệm ở đây). Từ http://www.php.net/splfixedarray:.

"Sự khác biệt chính giữa một SplFixedArray và PHP mảng bình thường là SplFixedArray là có độ dài cố định và cho phép chỉ số nguyên trong phạm vi như chỉ số Ưu điểm là nó cho phép một nhanh hơn thực hiện mảng"

Tuy nhiên, sử dụng một mảng của 100000 mục, cho thấy rằng nó cũng sử dụng ít RAM:

$users = array(); 
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 'name' => 'default'); 
} 
echo memory_get_peak_usage(true); //returns 31457280 

$users = new SplFixedArray(100000); 
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 
      'name' => 'default'); 
} 
echo memory_get_peak_usage(true); //return 26738688 
+2

Nhưng nói chung SplFixedArrays làm trong thực tế có một dấu chân bộ nhớ nhỏ hơn. – Mahn

+0

Bạn nói đúng, tôi đã thử nghiệm và cập nhật câu trả lời của tôi với kết quả, rất hay để biết. – periklis

Các vấn đề liên quan