Vòng lặp foreach hay for nào nhanh hơn trong php?

Trước hết, tôi hiểu rằng trong 90% ứng dụng, sự khác biệt về hiệu suất là hoàn toàn không liên quan, nhưng tôi chỉ cần biết cấu trúc nào nhanh hơn. Cái đó và…

Thông tin hiện có về chúng trên mạng thật khó hiểu. Nhiều người nói rằng foreach là tệ, nhưng về mặt kỹ thuật, nó sẽ nhanh hơn vì nó được cho là đơ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 dường như cũng rất chậm [hoặc đây không phải là một thứ của PHP?]. Tôi đang nói về các hàm mảng. tiếp theo [] trước [] đặt lại [], v.v. tốt, nếu chúng thậm chí là các hàm 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 quan tâm đến việc duyệt qua các mảng theo các bước của bất kỳ thứ gì lớn hơn 1 [cũng không có bước âm nào, tức là. lặp ngược]. Tôi cũng không quan tâm đến việc truyền tải đến và đi 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 với các mảng có hơn 1000 khóa xảy 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 một ứng dụng. Ngoài ra, đối với các hoạt động, phần lớn chỉ thao tác chuỗi và tạo tiếng vang

Dưới đây là một vài trang web tham khảo.
http. //www. phpbench. com/
http. //www. php. lt/điểm chuẩn/phpbench. php

Những gì tôi nghe thấy ở khắp mọi nơi

  • foreach chậm, và do đó, for/______7 nhanh hơn
  • PHPs foreach sao chép mảng mà nó lặp lại;
  • mã như thế này. $key = array_keys[$aHash]; $size = sizeOf[$key];
    for [$i=0; $i < $size; $i++]
    nhanh hơn một foreach

Đây là vấn đề của tôi. Tôi đã viết kịch bản thử nghiệm này. http. //pastebin. com/1ZgK07US và bất kể tôi chạy tập lệnh bao nhiêu lần, tôi vẫn nhận được thông báo như thế này

tổng dài [ListintList] { kết quả dài = 0; . ForEach[delegate[int i] { result += i; }];

Một nguyên tắc nhỏ cần ghi nhớ là "90% thời gian thực thi tập lệnh của bạn chiếm 10% mã". Cứ cho rằng đó là một sự khái quát hóa rộng rãi và nó có lẽ cũng không đúng lắm, tuy nhiên nguyên tắc là đúng. bạn có thể dành hàng giờ đồng hồ để tối ưu hóa chương trình của mình một cách ngẫu nhiên và thấy nó chạy không nhanh hơn vì bạn đã tối ưu hóa các bit không được chạy thường xuyên. Đúng là, từ quan điểm hoàn toàn mang tính lập trình, việc tối ưu hóa ngay cả những đoạn mã hiếm khi được sử dụng không bao giờ là điều xấu, tuy nhiên, rất ít người và thậm chí ít công ty có thời gian dành để tối ưu hóa mọi thứ, vì vậy bạn nên cố gắng tập trung nỗ lực của mình vào những gì sẽ mang lại hiệu quả.

Một trong những nơi tốt nhất để tìm kiếm các cơ hội tối ưu hóa là trong các vòng lặp, vì chúng thể hiện rõ ràng mã cần được thực thi nhiều lần. Có một số cách bạn có thể tăng tốc độ thực hiện vòng lặp, trong đó có hai cách phổ biến nhất. gọi một hàm như một phần của điều kiện vòng lặp và mã bất biến vòng lặp

Hãy xem xét ví dụ đầu tiên này

for [$i = 1; $i < count[$myarr]; ++$i] {
    //
}

Ở đây chúng tôi có một số mã thực hiện một hành động một lần cho mọi phần tử trong một mảng - một hành động khá phổ biến, như bạn đã biết. Tuy nhiên, do cách triển khai hàm count[] nên nó sẽ được thực hiện trong mỗi lần lặp vòng lặp. Nghĩa là, nếu chúng ta đặt $myarr thành một mảng chứa 100 phần tử, PHP sẽ đếm nó 100 lần - một lần cho mỗi lần vòng lặp diễn ra. Đôi khi đây là hành vi mong muốn. Ví dụ: nếu bạn đang thay đổi số lượng phần tử trong mảng bên trong vòng lặp, tất nhiên bạn sẽ cần tính toán lại kích thước của nó với mỗi lần lặp lại. Tuy nhiên, thường thì kích thước không cố định, vậy tại sao phải làm cho PHP tìm nạp kích thước của nó mỗi lần?

Nội bộ PHP thực sự lưu trữ số lượng phần tử trong mảng, do đó, về mặt kỹ thuật, việc gọi hàm đếm [] không làm cho PHP đếm từng phần tử riêng lẻ. Tuy nhiên, nó vẫn cần phải nhảy qua các vòng bổ sung nhờ lệnh gọi hàm, đó là lý do tại sao có sự khác biệt về tốc độ đáng chú ý ở đây

Một giải pháp tốt hơn nhiều là tính toán kích thước mảng chỉ một lần, bên ngoài vòng lặp, như thế này

$len = count[$myarr];

for [$i = 1; $i < $len; ++$i] {
    //
}

Đương nhiên, lợi ích của việc thay đổi phương thức nhanh hơn này phụ thuộc phần lớn vào độ lớn của mảng. Không có vấn đề gì, tốt hơn là tính toán kích thước mảng bên ngoài vòng lặp vì nó sẽ luôn nhanh gấp đôi, tuy nhiên nhanh gấp đôi so với "rất nhanh" thì không đáng chú ý. Hãy thử kịch bản này để cung cấp cho mình một ý tưởng


Trên máy tính thử nghiệm của tôi, sử dụng bộ đếm [] trong vòng lặp mất tám giây và không sử dụng bộ đếm trong vòng lặp mất bốn giây - một sự khác biệt khá lớn, nhưng đó là trên một mảng gồm 3.000.000 mục

Vấn đề vòng lặp "phải tránh" thứ hai là mã bất biến vòng lặp, là cách tính toán những thứ bên trong vòng lặp có thể được thực hiện, tất cả hoặc một phần, bên ngoài vòng lặp. Ví dụ: xem xét đoạn mã sau


Bên trong vòng lặp bên trong [$j], bạn sẽ thấy các giá trị được đưa vào một mảng hai chiều bằng ba phép tính được thêm vào. $n * 100, $i * $n và $j * $n. Trong ba giá trị này, $n * 100 sẽ luôn có cùng giá trị vì $n không thay đổi và 100 luôn là 100. Tuy nhiên, phép tính đó sẽ được thực hiện 10.000 lần, mỗi lần đều có cùng một câu trả lời, điều này khiến nó trở thành bất biến vòng lặp. Tương tự, $i * $n không thay đổi, nhưng không thay đổi bên trong vòng lặp bên trong, vì vậy đây là bất biến vòng lặp chỉ đối với vòng lặp bên trong. Phép tính cuối cùng, $j * $n, không thay đổi và do đó không phải là bất biến vòng lặp

Các vòng lặp nên được viết lại như thế này


Mã mới này đã loại bỏ bất biến vòng lặp, do đó làm cho tập lệnh chạy nhanh hơn. Mã bất biến vòng lặp thường dễ phát hiện và, không giống như trong ví dụ trên, thường mang lại hiệu suất tăng đáng kể - đặc biệt nếu một hàm phức tạp đang được gọi

Vòng lặp nào nhanh nhất trong PHP?

Vòng lặp do-while đáng kể là vòng lặp nhanh nhất. do-while thực sự nhanh hơn while gần một nửa. Tôi biết rằng chúng dành cho các mục đích khác nhau [ while kiểm tra điều kiện trước khi vòng lặp thực thi và do-while thực thi ít nhất một lần].

Vòng lặp for hoặc foreach nào nhanh hơn trong PHP?

Vòng lặp foreach tốt hơn nhiều và hoạt động tốt hơn so với vòng lặp for.

Vòng lặp foreach có chậm hơn vòng lặp không?

forEach Loop . Câu lệnh break có thể được sử dụng để thoát khỏi vòng lặp. It is slower than the traditional loop in performance. The break statement can be used to come out from the loop.

foreach có nhanh hơn for loop không?

Trong trường hợp bạn làm việc với một tập hợp các đối tượng, vòng lặp foreach sẽ tốt hơn, nhưng nếu bạn tăng một số, vòng lặp for sẽ tốt hơn. Lưu ý rằng trong trường hợp cuối cùng, bạn có thể làm điều gì đó như. foreach [int i trong Enumerable. Phạm vi[1, 10]]

Chủ Đề