ไม่count()จริงๆนับองค์ประกอบทั้งหมดของอาร์เรย์ PHP หรือค่านี้แคชไว้ที่ไหนสักแห่งและเพิ่งได้รับการดึง?
ไม่count()จริงๆนับองค์ประกอบทั้งหมดของอาร์เรย์ PHP หรือค่านี้แคชไว้ที่ไหนสักแห่งและเพิ่งได้รับการดึง?
คำตอบ:
เราสามารถดูที่มา:
/ext/standard/array.c
PHP_FUNCTION(count)การโทรphp_count_recursive()ซึ่งจะเรียกzend_hash_num_elements()ใช้อาร์เรย์ที่ไม่เรียกซ้ำซึ่งใช้วิธีนี้:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
ดังนั้นคุณจะเห็นมันสำหรับO(1)$mode = COUNT_NORMAL
IS_CONSISTENT(ht)ทำ แต่?
ใน PHP 5+ ความยาวจะถูกเก็บไว้ในอาร์เรย์ดังนั้นการนับจะไม่เสร็จสิ้นในแต่ละครั้ง
แก้ไข: คุณอาจพบที่น่าสนใจการวิเคราะห์นี้: ผลการดำเนินงานจำนวน PHP แม้ว่าความยาวของอาร์เรย์จะได้รับการดูแลโดยอาร์เรย์ แต่ก็ยังดูเหมือนว่าจะเร็วกว่าหากคุณจะโทรcount()หลายครั้ง
PHP เก็บขนาดของอาร์เรย์ไว้ภายใน แต่คุณยังคงเรียกใช้ฟังก์ชันเมื่อช้ากว่าที่จะไม่สร้างดังนั้นคุณจะต้องเก็บผลลัพธ์ไว้ในตัวแปรหากคุณกำลังทำบางสิ่งเช่นใช้ใน วน:
ตัวอย่างเช่น,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
นอกจากนี้คุณไม่สามารถแน่ใจได้ตลอดเวลาว่าcountกำลังถูกเรียกใช้อาร์เรย์ หากมีการเรียกใช้กับวัตถุที่ใช้งานCountableเช่นcountเมธอดของวัตถุนั้นจะถูกเรียก
the count method of that object will be calledช่วยอธิบายหน่อยได้ไหม
Countableอินเตอร์เฟซแล้วโทรเป็นสิ่งเดียวกับการโทรcount($object) $object->count()ดู3v4l.org/oYSSCเช่น
you're still making a function call when which is slower than not making oneคำพูดนี้อาจผิดได้ หากคุณกำลังทำการส่งผ่านด้วยตนเองนั่นคือO(n)การดำเนินการ O(1)แต่ถ้าคุณเพียงต้องการที่จะดึงค่าก่อนการคำนวณการดำเนินการแล้ว