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];
nhanh hơn một
for [$i=0; $i < $size; $i++]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