2011-12-30 5 views
11

Tôi bắt đầu sử dụng các mô hình lập trình chức năng trong php và tự hỏi tác động của hiệu suất là gì. Một số googling chỉ có vẻ nói rằng có một số. Để cụ thể, tôi muốn biết:hiệu suất hoạt động ẩn danh trong PHP

  • Có thực sự tác động đến hiệu suất hay đó là huyền thoại đô thị?
  • Tác động hiệu suất (hy vọng ai đó đã thực hiện các tiêu chuẩn) là gì?
  • Điều gì gây ra tác động này (nếu có)?
  • Chi phí cố định hay mỗi lần thực thi?

Bất kỳ tài nguyên mà bạn có guys sẽ được đánh giá rất nhiều :)

Cảm ơn trước

+0

Câu trả lời này là kết quả hàng đầu của Google về "hiệu suất hoạt động ẩn danh php" https://hackernoon.com/the-decline-of-stack-overflow-7cb69faa575d – jchook

Trả lời

17

tôi đã làm một số thử nghiệm với array_map(), gọi nó với:

  1. Tên của một hàm (array_map('test', $myArray);)
  2. Biến có chứa đóng (array_map($test, $myArray);)
  3. Một đóng cửa (array_map(function{}(), $myArray);)

Trong cả ba trường hợp, chức năng hoàn toàn trống rỗng (function test(){})

Các kết quả cho một mảng với 1.000.000 mục ($myArray = range(1,1000000);)

Function: 0.693s 
Variable:0.703s 
Closure: 0.694s 

Đối với một mảng 10.000.000 mặt hàng, kết quả là:

Function: 8.913s 
Variable: 8.169s 
Closure: 8.117s 

Vì vậy, trong cả hai trường hợp, chúng ta không có nhiều chi phí, nếu có.

Đồng thời xem nhận xét thứ 4 trên http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures Kết quả cũng giống như vậy. Trong nhận xét đó, bạn cũng thấy rằng create_function() chậm hơn đáng kể.

+0

Câu trả lời hay. Cũng lưu ý rằng create_function phải luôn phân tích cú pháp php khi chạy, do đó bạn sẽ mất nhiều thời gian nếu bạn sử dụng bộ nhớ đệm opcode. – symcbean

+0

Nhưng những gì về tương đương phi chức năng tương đương 'foreach ($ myArray là $ foo) {}'? :) – deceze

+1

Chỉ cần làm bài kiểm tra 10.000.000: 4.780s Tôi mong đợi nó sẽ nhanh hơn * * *, nhưng đây là một * lot *. (Mặc dù một vài lần chạy lại nhanh chóng của các phiên bản khác cho thấy chúng cũng nhanh hơn một chút, nhưng ở sân chơi bóng chày thứ hai.) Để thực hiện công bằng, tôi đã làm 'foreach ($ a AS $ i) {test ($ i);} ', do đó 'thực hiện tương tự' như' array_map() calls'. –