ไม่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)
แต่ถ้าคุณเพียงต้องการที่จะดึงค่าก่อนการคำนวณการดำเนินการแล้ว