2009-12-31 31 views
5

Tôi đã thấy ở một vài nơi gần đây mọi người nói rằng PHP có khả năng đệ quy kém. Gần đây tôi đã viết một hàm đệ quy php cho đồ thị traversal và thấy nó rất chậm so với java. Tôi không biết liệu điều này là do khả năng đệ quy của php hay vì php chậm hơn java nói chung.Khả năng xử lý đệ quy của PHP

Một số googling tiết lộ này (http://bugs.php.net/bug.php?id=1901)

[07 Tháng 8 1999 12:25 UTC] Zeev tại cvs chấm chấm php ròng

PHP 4.0 (Zend) sử dụng ngăn xếp cho dữ liệu chuyên sâu, thay vì sử dụng vùng chứa . Điều đó có nghĩa là các hàm đệ quy đệ quy đáng kể là thấp hơn các ngôn ngữ khác.

Đó là tương đối dễ dàng để kể Zend không sử dụng ngăn xếp cho dữ liệu này, và sử dụng heap thay vì - mà sẽ tăng đáng kể số lượng chức năng đệ quy có thể - trong giá tốc độ giảm. Nếu bạn đang quan tâm đến cài đặt như vậy, hãy để tôi biết, chúng tôi có thể thêm công tắc biên dịch biên dịch.

Điều gì có nghĩa là php sử dụng ngăn xếp cho dữ liệu chuyên sâu? Không php không thiết lập một ngăn xếp thời gian chạy? Ngoài ra, có thật là nói chung rằng đệ quy trong php chậm hơn nhiều so với các ngôn ngữ khác? Và bao nhiêu?

Cảm ơn!

+6

Lỗi cổ đóng kín batman! – cgp

+2

altCognito có một điểm. Bạn có đang sử dụng PHP4 không? Hay bạn đang trên 5? – fennec

Trả lời

2

Được rồi, tôi sẽ đâm vào nó.

Đầu tiên: "Ngăn xếp" là khu vực được sử dụng để theo dõi cuộc gọi chức năng trong các chương trình loại C/C++ chuẩn. Đó là nơi mà các quy ước về ngôn ngữ lập trình và hệ điều hành xác định trong bộ nhớ, và nó được xử lý như một ngăn xếp (cấu trúc dữ liệu). Khi bạn gọi hàm C fibbonaci(int i) thì nó đặt biến số i và địa chỉ trả về của hàm đã bận gọi nó, trên ngăn xếp. Điều đó mất một số bộ nhớ. Khi nó được thực hiện với cuộc gọi chức năng đó, bộ nhớ có sẵn một lần nữa. Ngăn xếp có kích thước hữu hạn. Nếu bạn đang lưu trữ các biến rất lớn trên nó và thực hiện nhiều cuộc gọi đệ quy, sau đó bạn có thể chạy ra khỏi phòng. Đúng?

Vì vậy .....

Rõ ràng Zend có hai cách để phân bổ dữ liệu: trên heap (một khu vực hơn tổng yêu cầu bộ nhớ từ) và trên stack, và chồng là một nơi hiệu quả hơn để có chúng vì cách mọi thứ được lập trình. (Tôi không biết tại sao, nhưng tôi có thể đoán. Có thể có những vấn đề về bộ nhớ đệm rất thấp - tôi cho rằng stack có khả năng nằm trong L1 hoặc L2 cache hơn bộ nhớ tùy ý trong heap, vì CPU là rất có thể sẽ sử dụng khu vực đó rất thường xuyên - mỗi khi bạn gọi một hàm, trên thực tế. Cũng có thể có phí phân bổ để truy cập dữ liệu heap.)

Dữ liệu "Chuyên sâu" trong ngữ cảnh này, tôi tin rằng, đề cập đến dữ liệu rất có thể sẽ được sử dụng rất sớm hoặc rất thường xuyên. Nó sẽ có ý nghĩa để sử dụng phân bổ dựa trên stack nhanh hơn cho các biến này. Loại biến nào bạn chắc chắn sẽ sử dụng rất nhanh? Vâng, làm thế nào về các tham số cho một chức năng? Bạn rất có khả năng sử dụng chúng: nếu không, tại sao bạn sẽ bận tâm để vượt qua chúng xung quanh?Chúng cũng có thể là các mục dữ liệu nhỏ (tham chiếu đến các cấu trúc dữ liệu lớn hơn là các cấu trúc dữ liệu khổng lồ - vì điều đó cho phép bạn sao chép trên không, trong số những thứ khác). Vì vậy, ngăn xếp có thể có ý nghĩa để lưu trữ các tham số hàm PHP cho hầu hết các lập trình viên PHP ... nhưng nó không thành công trong đệ quy sớm hơn.

Hy vọng rằng câu trả lời ít nhất "điều này có nghĩa là gì?". Đối với câu hỏi về hiệu suất đệ quy của bạn: Tự mình đi điểm chuẩn; nó có thể phụ thuộc vào loại đệ quy bạn đang cố gắng làm.

+0

@Eric: về chủ đề đo hiệu suất, XDebug cung cấp lược tả PHP (http://xdebug.org/docs/profiler). – outis

0

Khi đoán, tôi muốn nói rằng sự cố của bạn nằm ở đâu đó ngoài chính bản thân đệ quy. Đối với nhiều thứ, Java nhanh hơn rất nhiều so với PHP. Có, loại, cách để cải thiện hiệu suất của PHP.

Tuy nhiên, giới hạn đệ quy PHP dẫn đến PHP chạy ra khỏi ngăn xếp và bị lỗi, với thông điệp 'tràn ngăn xếp' đáng sợ (kiểu chơi chữ có chủ ý). Tại thời điểm này, chương trình của bạn ngừng thực thi.

Nếu PHP đang sử dụng ngăn xếp động, bạn có thể thấy một số (nhẹ) chậm lại do thời gian cần để thực hiện ngăn xếp đến một khối bộ nhớ lớn hơn.

Dù sao thì, tôi cần biết thêm một chút về những gì bạn đang làm để xác định vấn đề hiệu suất của bạn, đó là điều mà tôi làm để kiếm sống ...

Các vấn đề liên quan