Trước hết, tôi hiểu trong 90% ứng dụng, sự khác biệt hiệu năng là hoàn toàn không liên quan, nhưng tôi chỉ cần biết đó là cấu trúc nhanh hơn. Đó và ...
Các thông tin hiện có sẵn trên mạng là khó hiểu. Rất nhiều người nói foreach là xấu, nhưng về mặt kỹ thuật thì nó sẽ nhanh hơn vì nó giả sử đơn giản hóa việc viết một mảng truyền tải bằng cách sử dụng các trình vòng lặp. Các trình vòng lặp, một lần nữa được cho là nhanh hơn, nhưng trong PHP cũng rõ ràng là chết chậm (hoặc đây không phải là một điều PHP?). Tôi đang nói về các hàm mảng: next () trước () reset (), v.v., nếu chúng là các hàm chẵn và không phải là một trong những tính năng ngôn ngữ PHP trông giống như các hàm.
Để thu hẹp điều này xuống một chút : Tôi không thú vị khi duyệt qua các mảng trong các bước của bất kỳ thứ gì nhiều hơn 1 (cũng không có bước tiêu cực nào, tức là lặp lại đảo ngược). Tôi cũng không quan tâm đến việc đi qua và từ các điểm tùy ý, chỉ từ 0 đến chiều dài. Tôi cũng không thấy việc thao tác các mảng với hơn 1000 khóa diễn ra thường xuyên, nhưng tôi thấy một mảng được duyệt nhiều lần trong logic của ứng dụng! Cũng như đối với các hoạt động, phần lớn chỉ thao tác chuỗi và tiếng vang.
Dưới đây là một số trang web tham khảo:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Những gì tôi nghe thấy ở khắp mọi nơi:
foreach
là chậm, và do đófor
/while
là nhanh hơn- PHP
foreach
sao chép mảng mà nó lặp đi lặp lại; để làm cho nó nhanh hơn bạn cần sử dụng tài liệu tham khảo - mã như thế này: nhanh hơn một
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Đây là vấn đề của tôi. Tôi đã viết tập lệnh thử nghiệm này: http://pastebin.com/1ZgK07US và cho dù tôi có chạy tập lệnh bao nhiêu lần đi chăng nữa, tôi vẫn nhận được một cái gì đó như thế này:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Nói ngắn gọn:
foreach
nhanh hơn soforeach
với tham chiếuforeach
nhanh hơnfor
foreach
nhanh hơn sofor
với bảng băm
Ai đó có thể giải thích?
- Tôi có làm điều gì sai?
- Là tham chiếu foreach điều thực sự làm cho một sự khác biệt? Tôi có nghĩa là tại sao nó sẽ không sao chép nó nếu bạn vượt qua tham chiếu?
- Mã lặp tương đương cho câu lệnh foreach là gì; Tôi đã thấy một vài cái trên mạng nhưng mỗi lần tôi kiểm tra chúng thì thời gian lại tắt; Tôi cũng đã thử nghiệm một vài cấu trúc trình lặp đơn giản nhưng dường như chưa bao giờ nhận được kết quả tốt - các trình lặp mảng trong PHP có tệ không?
- Có cách / phương thức / cấu trúc nhanh hơn để lặp lại mặc dù một mảng khác ngoài FOR / FOREACH (và WHILE) không?
Phiên bản PHP 5.3.0
Chỉnh sửa: Trả lời Với sự giúp đỡ từ những người ở đây tôi đã có thể ghép các câu trả lời cho tất cả các câu hỏi. Tôi sẽ tóm tắt chúng ở đây:
- "Tôi có làm điều gì sai?" Sự đồng thuận dường như là: có, tôi không thể sử dụng tiếng vang trong điểm chuẩn. Cá nhân, tôi vẫn không thấy tiếng vang là một số chức năng với thời gian thực hiện ngẫu nhiên hoặc cách bất kỳ chức năng nào khác khác nhau - điều đó và khả năng của kịch bản đó tạo ra kết quả chính xác của bài giảng tốt hơn mọi thứ đều khó để giải thích mặc dù chỉ là "bạn đang sử dụng tiếng vang" (tôi nên sử dụng cái gì). Tuy nhiên, tôi thừa nhận bài kiểm tra nên được thực hiện với một cái gì đó tốt hơn; mặc dù một thỏa hiệp lý tưởng không đến với tâm trí.
- "Có phải PHP foreach điều tham khảo thực sự tạo ra sự khác biệt? Ý tôi là tại sao nó sẽ không sao chép nó nếu bạn vượt qua tham chiếu?" ircmaxell cho thấy rằng đúng vậy, thử nghiệm thêm dường như chứng minh trong hầu hết các trường hợp tham chiếu nên nhanh hơn - mặc dù với đoạn mã trên của tôi, hầu hết chắc chắn không có nghĩa là tất cả. Tôi chấp nhận vấn đề có lẽ quá không trực quan để bận tâm ở mức độ như vậy và sẽ yêu cầu một cái gì đó cực đoan như dịch ngược để thực sự xác định cái nào tốt hơn cho mỗi tình huống.
- "Mã trình lặp tương đương cho câu lệnh foreach là gì; tôi đã thấy một số ít trên mạng nhưng mỗi lần tôi kiểm tra chúng thì thời gian đã tắt; Tôi cũng đã thử một vài cấu trúc trình lặp đơn giản nhưng dường như không bao giờ nhận được kết quả tốt - các trình lặp mảng trong PHP có khủng khiếp không? " ircmaxell cung cấp câu trả lời dưới đây; mặc dù mã chỉ có thể hợp lệ cho phiên bản PHP> = 5
- "Có cách / phương thức / cấu trúc nhanh hơn để lặp lại mặc dù một mảng không phải là FOR / FOREACH (và WHILE) không?" Cảm ơn đi đến Gordon cho câu trả lời. Việc sử dụng các kiểu dữ liệu mới trong PHP5 sẽ giúp tăng hiệu năng hoặc tăng bộ nhớ (một trong hai cách có thể được mong muốn tùy thuộc vào tình huống của bạn). Mặc dù tốc độ rất cao, nhiều loại mảng mới dường như không tốt hơn mảng (), nhưng splp Warriorityqueue và splobjectst Storage dường như nhanh hơn đáng kể. Liên kết được cung cấp bởi Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Cảm ơn tất cả mọi người đã cố gắng giúp đỡ.
Tôi có thể sẽ dính vào foreach (phiên bản không tham chiếu) cho bất kỳ giao dịch đơn giản nào.