ก่อนอื่นฉันเข้าใจใน 90% ของแอปพลิเคชันความแตกต่างของประสิทธิภาพนั้นไม่เกี่ยวข้องกันเลย แต่ฉันแค่ต้องรู้ว่าตัวไหนเร็วกว่า นั่นแล ...
ข้อมูลที่มีอยู่บนอินเทอร์เน็ตในปัจจุบันทำให้เกิดความสับสน หลายคนบอกว่า foreach ไม่ดี แต่ในทางเทคนิคแล้วมันควรจะเร็วกว่าเพราะมันควรจะทำให้การเขียนการส่งผ่านอาร์เรย์ง่ายขึ้นโดยใช้ตัววนซ้ำ Iterators ซึ่งคาดว่าจะเร็วขึ้นอีกครั้ง แต่ใน PHP ก็เห็นได้ชัดว่าช้า (หรือนี่ไม่ใช่ PHP?) ฉันกำลังพูดถึงฟังก์ชั่นอาร์เรย์: next () prev () reset () เป็นต้นถ้าเป็นฟังก์ชั่นที่สม่ำเสมอและไม่ใช่หนึ่งในคุณสมบัติภาษา PHP ที่มีลักษณะเหมือนฟังก์ชัน
เพื่อ จำกัด สิ่งนี้ให้แคบลงเล็กน้อย : ฉันไม่น่าสนใจในการสำรวจอาร์เรย์ในขั้นตอนที่มากกว่า 1 (ไม่มีขั้นตอนเชิงลบเช่นกันเช่นการวนซ้ำย้อนกลับ) ฉันยังไม่สนใจการลัดเลาะไปและกลับจากจุดใด ๆ โดยพลการเพียงแค่ 0 ถึงความยาว ฉันไม่เห็นการจัดการอาร์เรย์ที่มีมากกว่า 1,000 คีย์เกิดขึ้นเป็นประจำ แต่ฉันเห็นว่าอาร์เรย์ถูกข้ามผ่านหลายครั้งด้วยตรรกะของแอปพลิเคชัน! สำหรับการดำเนินการส่วนใหญ่เป็นเพียงการจัดการสตริงและการสะท้อนเท่านั้น
เว็บไซต์อ้างอิงบางส่วนมีดังนี้:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
สิ่งที่ฉันได้ยินทุกที่:
foreach
ช้าและทำให้for
/while
เร็วขึ้น- PHPs
foreach
คัดลอกอาร์เรย์ที่มันวนซ้ำ เพื่อให้เร็วขึ้นคุณต้องใช้การอ้างอิง - รหัสเช่นนี้เร็วกว่าไฟล์
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
นี่คือปัญหาของฉัน ฉันเขียนสคริปต์ทดสอบนี้: http://pastebin.com/1ZgK07USและไม่ว่าฉันจะเรียกใช้สคริปต์กี่ครั้งฉันจะได้รับสิ่งนี้:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
ในระยะสั้น:
foreach
เร็วกว่าforeach
การอ้างอิงforeach
เร็วกว่าfor
foreach
เร็วกว่าfor
ตารางแฮช
ใครช่วยอธิบายหน่อย
- ฉันทำอะไรผิดหรือเปล่า?
- PHP foreach สิ่งอ้างอิงสร้างความแตกต่างจริงหรือ? ฉันหมายถึงทำไมมันจะไม่คัดลอกถ้าคุณผ่านการอ้างอิง?
- รหัสตัววนซ้ำที่เท่ากันสำหรับคำสั่ง foreach คืออะไร ฉันเคยเห็นอยู่สองสามแห่งบนเน็ต แต่ทุกครั้งที่ฉันทดสอบพวกเขาเวลานั้นเป็นไปไม่ได้ ฉันยังได้ทดสอบโครงสร้างตัววนซ้ำแบบง่าย ๆ แต่ดูเหมือนจะไม่ได้ผลลัพธ์ที่ดีเลย - ตัวทำซ้ำอาร์เรย์ใน PHP นั้นแย่มากหรือไม่?
- มีวิธี / วิธีการ / โครงสร้างที่เร็วกว่าในการวนซ้ำแม้ว่าอาร์เรย์อื่นที่ไม่ใช่ FOR / FOREACH (และ WHILE)
PHP เวอร์ชัน 5.3.0
แก้ไข: คำตอบ ด้วยความช่วยเหลือจากผู้คนที่นี่ฉันสามารถปะติดปะต่อคำตอบของคำถามทั้งหมดได้ ฉันจะสรุปไว้ที่นี่:
- “ ฉันทำอะไรผิดเหรอ?” ฉันไม่สามารถใช้เสียงสะท้อนในเกณฑ์มาตรฐานได้ โดยส่วนตัวแล้วฉันยังไม่เห็นว่า echo เป็นฟังก์ชันที่มีเวลาดำเนินการแบบสุ่มอย่างไรหรือฟังก์ชันอื่น ๆ แตกต่างกันอย่างไร - และความสามารถของสคริปต์นั้นในการสร้างผลลัพธ์เดียวกันของ foreach ได้ดีกว่าทุกอย่างที่ยาก เพื่ออธิบายว่าแค่ "คุณกำลังใช้เสียงสะท้อน" (ฉันควรใช้อะไร) อย่างไรก็ตามฉันยอมรับว่าการทดสอบควรทำด้วยสิ่งที่ดีกว่า แม้ว่าการประนีประนอมในอุดมคติจะไม่อยู่ในใจ
- "PHP foreach reference เป็นสิ่งที่สร้างความแตกต่างได้จริงหรือฉันหมายความว่าทำไมมันจะไม่คัดลอกถ้าคุณผ่านการอ้างอิง" ircmaxell แสดงให้เห็นว่าใช่แล้วการทดสอบเพิ่มเติมดูเหมือนจะพิสูจน์ได้ในกรณีส่วนใหญ่การอ้างอิงควรจะเร็วกว่า - แม้ว่าจะได้รับตัวอย่างโค้ดด้านบนของฉัน แต่ส่วนใหญ่ไม่ได้หมายถึงทั้งหมด ฉันยอมรับว่าปัญหานี้อาจไม่ใช้งานง่ายเกินไปที่จะรบกวนในระดับดังกล่าวและต้องการบางสิ่งบางอย่างที่รุนแรงเช่นการแยกส่วนเพื่อพิจารณาว่าสถานการณ์ใดดีกว่าสำหรับแต่ละสถานการณ์
- "รหัสตัววนซ้ำที่เท่ากันสำหรับคำสั่ง foreach คืออะไรฉันเคยเห็นบางส่วนบนเน็ต แต่ทุกครั้งที่ฉันทดสอบพวกเขาเวลาจะหยุดฉันยังทดสอบโครงสร้างตัววนซ้ำแบบง่าย ๆ สองสามอย่าง แต่ดูเหมือนจะไม่ได้ผลลัพธ์ที่ดีเลยแม้แต่น้อย - ตัวทำซ้ำอาร์เรย์ใน PHP นั้นแย่มากหรือไม่ " ircmaxell ให้คำตอบร้อง; แม้ว่าโค้ดอาจใช้ได้กับเวอร์ชัน PHP เท่านั้น> = 5
- "มีวิธี / วิธีการ / โครงสร้างที่เร็วกว่าในการวนซ้ำแม้ว่าอาร์เรย์อื่นที่ไม่ใช่ FOR / FOREACH (และในขณะที่)" ขอบคุณกอร์ดอนสำหรับคำตอบ การใช้ประเภทข้อมูลใหม่ใน PHP5 ควรเพิ่มประสิทธิภาพหรือเพิ่มหน่วยความจำ (ซึ่งอาจเป็นที่ต้องการขึ้นอยู่กับสถานการณ์ของคุณ) ในขณะที่อาร์เรย์ประเภทใหม่ ๆ มีความเร็วที่ชาญฉลาดดูเหมือนจะไม่ดีไปกว่า array () แต่ splpriorityqueue และ splobjectstorage ดูเหมือนจะเร็วกว่ามาก ลิงก์ที่จัดทำโดย Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
ขอบคุณทุกคนที่พยายามช่วย
ฉันจะยึดติดกับ foreach (เวอร์ชันที่ไม่มีการอ้างอิง) สำหรับการข้ามผ่านแบบง่ายๆ