Có count()
thực sự đếm tất cả các phần tử của một mảng PHP hay giá trị này được lưu vào bộ nhớ đệm ở đâu đó và chỉ được truy xuất?
Có count()
thực sự đếm tất cả các phần tử của một mảng PHP hay giá trị này được lưu vào bộ nhớ đệm ở đâu đó và chỉ được truy xuất?
Câu trả lời:
Chà, chúng ta có thể xem nguồn:
/ext/standard/array.c
PHP_FUNCTION(count)
các lệnh gọi php_count_recursive()
, lần lượt gọi zend_hash_num_elements()
mảng không đệ quy, được triển khai theo cách này:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Vì vậy, bạn có thể thấy, nó O(1)
dành cho $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
mặc dù?
Trong PHP 5+ độ dài được lưu trữ trong mảng nên việc đếm không được thực hiện mỗi lần.
CHỈNH SỬA: Bạn cũng có thể thấy phân tích này thú vị: Hiệu suất đếm PHP . Mặc dù độ dài của mảng được duy trì bởi mảng, nhưng có vẻ như việc giữ nó sẽ nhanh hơn nếu bạn định gọi count()
nhiều lần.
PHP lưu trữ kích thước của một mảng trong nội bộ, nhưng bạn vẫn thực hiện một lệnh gọi hàm khi nó chậm hơn so với việc không tạo, vì vậy bạn sẽ muốn lưu trữ kết quả trong một biến nếu bạn đang làm điều gì đó như sử dụng nó trong vòng:
Ví dụ,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Ngoài ra, không phải lúc nào bạn cũng có thể chắc chắn rằng mình count
đang được gọi trên một mảng. Nếu nó được gọi trên một đối tượng thực thi Countable
chẳng hạn, count
phương thức của đối tượng đó sẽ được gọi.
the count method of that object will be called
, Bạn có thể vui lòng giải thích điều này một chút
Countable
giao diện, thì việc gọi count($object)
cũng giống như gọi $object->count()
. Xem 3v4l.org/oYSSC chẳng hạn.
you're still making a function call when which is slower than not making one
Tuyên bố này có thể sai. Nếu bạn đang thực hiện chuyển tải thủ công, đó là O(n)
hoạt động. Nhưng nếu bạn chỉ muốn truy xuất một giá trị được tính toán trước, thì hoạt động là O(1)
.