PHP array: นับหรือ sizeof?


216

เพื่อหาจำนวนองค์ประกอบใน PHP $arrayซึ่งเร็วกว่า / ดีกว่า / แข็งแกร่งกว่า?

count($array)หรือsizeof($array)?

แก้ไข

ขอบคุณ Andy Lester ฉันได้ปรับปรุงคำถามของฉันให้มีความหมายจากมุมมองหลายภาษา ผู้แสดงความคิดเห็นด้วยตนเองพูดว่า

"[sizeof] ไม่ได้มีความหมายเหมือนกันในภาษาอื่น ๆ อีกมากมายตาม C"

มันเป็นเรื่องจริงเหรอ?


72
การอ้างอิงของ Daft Punk ... :)
Ben

2
คำถามที่ดีมาก แต่ที่นี่เป็นเว็บไซต์มาตรฐานที่ดีที่บอกว่าขนาดของมันเร็วกว่า
21 ปี

คำตอบ:


191

ฉันจะใช้count()หากพวกเขาเหมือนกันเช่นเดียวกับในประสบการณ์ของฉันมันเป็นเรื่องธรรมดามากขึ้นและดังนั้นจะทำให้นักพัฒนาซอฟต์แวร์อ่านโค้ดของคุณน้อยลงเพื่อพูดว่า " sizeof()นั่นคืออะไร" และต้องปรึกษาเอกสาร

ฉันคิดว่ามันsizeof()ไม่ทำงานเหมือนใน C (การคำนวณขนาดของประเภทข้อมูล) มันอาจจะไม่ได้พูดถึงเรื่องนี้อย่างชัดเจนเพราะ PHP ถูกเขียนใน C และให้มากห่อชื่อเหมือนกันสำหรับฟังก์ชั่น C ( strlen(), printf()ฯลฯ )


92

ตามphpbench :

มันคุ้มค่ากับความพยายามในการคำนวณความยาวของลูปล่วงหน้าหรือไม่?

//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);
    //...
}

มีการกำหนดลูปที่มี 1,000 คีย์พร้อมค่า 1 ไบต์

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

ดังนั้นผมเองชอบที่จะใช้นับ ()แทนsizeof () กับ Calc


3
กรุณาบอกเพียงซึ่งใช้เวลาน้อยลง คำตอบนั้นค่อนข้างซับซ้อนและสับสนเช่นกัน! ขอบคุณ
Pratik

6
คุณทดสอบ php เวอร์ชันใด เวอร์ชันที่ใหม่กว่ามีการเพิ่มประสิทธิภาพมากมายซึ่งอาจทำให้ผลลัพธ์เหล่านี้ค่อนข้างแตกต่าง
John Hunt

4
ทำไมขนาดของเร็วกว่าโดยไม่บันทึกผลลัพธ์เป็นตัวแปร แต่เป็นอย่างอื่นด้วยวิธีอื่น นี่เป็นตัวเลือกการออกแบบที่ไม่ดีในล่าม php ที่ทำให้เกิดค่าใช้จ่ายบางประเภทหรือไม่ ฉันต้องการทราบว่าคุณเปรียบเทียบกับสิ่งนี้ได้อย่างไรการวัดไมโครวินาทีทำให้ฉันกังวล อาจลองเรียกใช้ครั้งนี้เป็นจำนวนมากในวงนอกเพื่อวง?
FluorescentGreen5

1
คุณหมายถึงอะไรกับ "pre calc"
rubo77

1
@ rubo77 ดูรหัสข้างต้น; "pre-calc" กำลังกำหนดขนาดของอาร์เรย์หนึ่งครั้งก่อน for-loop หากไม่มี "pre-Calc" กำหนดขนาดของอาร์เรย์ภายใน for-loop
RobIII

38

พวกเขาเหมือนกันตาม sizeof()

ในกรณีที่ไม่มีเหตุผลใด ๆ ที่จะต้องกังวลเกี่ยวกับ "เร็วขึ้น" เสมอเพิ่มประสิทธิภาพสำหรับมนุษย์ ซึ่งเหมาะสมกับผู้อ่านของมนุษย์มากขึ้น?


19

ตามเว็บไซต์sizeof()เป็นนามแฝงcount()ดังนั้นพวกเขาควรใช้รหัสเดียวกัน อาจsizeof()มีค่าใช้จ่ายเล็กน้อยเพราะต้องแก้ไขให้ได้count()หรือไม่ มันควรจะน้อยมากแม้ว่า


53
ขอโทษด้วยที่เดา? ฉันแค่บอกว่าพวกเขาเป็นสิ่งเดียวกัน จากนั้นฉันทำการอนุมานเชิงตรรกะว่าการใช้นามแฝงสำหรับฟังก์ชั่นแทนฟังก์ชั่นที่เกิดขึ้นจริงอาจจะช้าลงเล็กน้อยมาก แต่ยอมรับว่าฉันไม่มีความคิดจริง ๆ โดยการวางคำไว้ล่วงหน้าด้วยคำว่า "บางที" ขอโทษที่ทำให้คุณขุ่นเคือง บางทีครั้งต่อไปฉันจะใช้คำว่า "เล็ก"
Andy Groff

8

ฉันรู้ว่ามันเก่า แต่ก็อยากจะพูดถึงว่าฉันลองกับ 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");
?>

และผลลัพธ์คือ:

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

count()ดังนั้นเพียงแค่การใช้งาน


สิ่งนี้น่าสนใจ คุณใช้ PHP เวอร์ชันอะไร
waza

@waza ฉันใช้ PHP 7.2
Mehdi Bounya

1
ด้วย 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

กรุณาใช้ฟังก์ชั่นการนับนี่เป็นตัวอย่างวิธีการนับอาร์เรย์ในองค์ประกอบ

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

count()ฟังก์ชั่นส่งกลับจำนวนขององค์ประกอบในอาร์เรย์

sizeof()ฟังก์ชั่นส่งกลับจำนวนขององค์ประกอบในอาร์เรย์

sizeof()ฟังก์ชั่นเป็นนามแฝงของcount()ฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.