Mảng PHP: đếm hay sizeof?


216

Để tìm số lượng phần tử trong PHP $array, cái nào nhanh hơn / tốt hơn / mạnh hơn?

count($array)hay sizeof($array)?

Biên tập

Nhờ Andy Lester, tôi đã tinh chỉnh câu hỏi của tôi có nghĩa từ góc độ đa ngôn ngữ. Những người bình luận thủ công nói

"[sizeof] không có nghĩa giống nhau ở nhiều ngôn ngữ khác dựa trên C"

Điều này có đúng không?


72
Một tài liệu tham khảo về Daft Punk ... :)
Ben

2
Câu hỏi rất hay. Nhưng đây là một trang web điểm chuẩn tốt, cho biết sizeof chỉ nhanh hơn 21 tiếng
sinaneker

Câu trả lời:


191

Tôi sẽ sử dụng count()nếu chúng giống nhau, vì theo kinh nghiệm của tôi, nó phổ biến hơn, và do đó sẽ khiến ít nhà phát triển đọc mã của bạn nói " sizeof(), đó là gì?" và phải tham khảo tài liệu.

Tôi nghĩ nó có nghĩa là sizeof()không hoạt động như trong C (tính kích thước của kiểu dữ liệu). Nó có lẽ đã đề cập đến một cách rõ ràng này vì PHP được viết bằng C, và cung cấp rất nhiều giấy gói hệt tên cho các chức năng C ( strlen(), printf(), vv)


92

Theo phpbench :

Có đáng nỗ lực để tính toán độ dài của vòng lặp trước?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}

Một vòng lặp với 1000 khóa với giá trị 1 byte được đưa ra.

                  +---------+----------+
                  | count() | sizeof() |
+-----------------+---------+----------+
| With precalc    |     152 |      212 |
| Without precalc |   70401 |    50644 |
+-----------------+---------+----------+  (time in µs)

Vì vậy, cá nhân tôi thích sử dụng Count () thay vì sizeof () với calc trước .


3
Xin vui lòng chỉ nói rằng mất ít thời gian hơn. Khác, câu trả lời là khá phức tạp và khó hiểu quá! Cảm ơn
Pratik

6
Bạn đã thử nghiệm phiên bản php nào? Các phiên bản mới hơn có rất nhiều tối ưu hóa có thể làm cho các kết quả này khá khác biệt
John Hunt

4
Tại sao sizeof nhanh hơn mà không lưu kết quả của nó thành một biến nhưng nếu không thì nó lại khác? Đây có phải là một số lựa chọn thiết kế xấu trong trình thông dịch php gây ra một số loại chi phí chọn lọc không? Tôi muốn biết làm thế nào bạn điểm chuẩn này, phép đo micro giây làm tôi lo lắng. có thể thử chạy nó một số lượng lớn thời gian trong một vòng lặp bên ngoài?
Huỳnh

1
bạn có ý nghĩa gì với "pre calc"?
rubo77

1
@ rubo77 Xem mã trên; "Pre-calc" đang xác định kích thước của mảng một lần, trước vòng lặp for. Không có "pre-calc" sẽ xác định kích thước của mảng bên trong vòng lặp
for

38

Chúng giống hệt nhau theo sizeof()

Trong trường hợp không có bất kỳ lý do để lo lắng về "nhanh hơn", luôn luôn tối ưu hóa cho con người. Điều này có ý nghĩa hơn đối với người đọc con người?


19

Theo trang web, sizeof()là một bí danh count(), vì vậy họ nên chạy cùng một mã. Có lẽ sizeof()có một chút chi phí vì nó cần phải giải quyết nó count()? Nó nên được rất tối thiểu mặc dù.


53
Vâng, xin lỗi vì đã đoán? Tôi chỉ nói rằng chúng thực sự giống nhau. Sau đó, tôi đã suy luận logic rằng việc sử dụng bí danh cho một chức năng thay vì chức năng thực tế có thể rất chậm, nhưng thừa nhận rằng tôi thực sự không có ý tưởng nào bằng cách đặt trước nó bằng từ "có lẽ". Xin lỗi nếu điều đó xúc phạm bạn. Có lẽ lần tới tôi sẽ sử dụng từ "vô hạn".
Andy Groff

8

Tôi biết điều này đã cũ nhưng chỉ muốn đề cập rằng tôi đã thử điều này với PHP 7.2:

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>

và kết quả là:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec

Vì vậy, chỉ cần sử dụng count().


Hay đấy. Bạn sử dụng phiên bản PHP nào?
waza

@waza Tôi đang sử dụng PHP 7.2
Mehdi Bounya

1
Với PHP 7.3.3: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB


-2

Vui lòng sử dụng hàm đếm, Dưới đây là ví dụ về cách đếm mảng trong một phần tử

$cars = array("Volvo","BMW","Toyota");
echo count($cars);

Các count()hàm trả về số phần tử trong một mảng.

Các sizeof()hàm trả về số phần tử trong một mảng.

Các sizeof()chức năng là một bí danh của count()hàm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.