2011-02-03 38 views
19

Chỉ cần tự hỏi nếu có ai có thông tin về những gì "chi phí" được kết hợp với bao gồm một tệp LARGE (600K hoặc hơn) php chứa 100 tệp lớp. Liệu nó có thực sự tạo ra sự khác biệt nhiều so với việc tự động tải các tệp riêng lẻ cho các tìm kiếm cụ thể trên một số thư mục trước khi tìm một kết quả phù hợp không?Chi phí hoạt động của "bao gồm" trong PHP là bao nhiêu?

Sẽ có bộ nhớ đệm APC để làm cho chi phí này không đáng kể?

+0

Để làm rõ, đây sẽ là "lớp cơ sở" cho ORM. Không có cách nào dễ dàng để phân biệt chúng bằng "hàm", chúng chỉ là biểu diễn của lược đồ cơ sở dữ liệu. Chúng tôi ghi đè lên chúng trên mỗi "bản dựng" và hiện tại chúng tôi mở rộng chúng hai lần cho cả đối tượng và mức ghi đè của bảng. Trên bất kỳ yêu cầu nhất định nào, chúng tôi đang tải khoảng 10-15 trong số đó. Trong các thử nghiệm ban đầu của tôi, tôi thấy không có sự khác biệt đáng chú ý nào giữa tải tệp đầy đủ và không. Chúng tôi đã kích hoạt APC, vì vậy có lẽ đó là một phần của nó? – FilmJ

Trả lời

20

Về cơ bản, chi phí bao gồm một tệp lớn tùy thuộc vào hệ thống của bạn. Giả sử bạn có một tệp lớn với 200 lớp.

Nếu bạn chỉ sử dụng 1 lớp, bao gồm tệp lớn sẽ đắt hơn bao gồm tệp lớp nhỏ cho lớp riêng lẻ đó.

Nếu bạn sử dụng tất cả 200 lớp, bao gồm tệp lớn sẽ ít tốn kém hơn đáng kể so với 200 tệp nhỏ.

Trường hợp điểm ngắt thực sự phụ thuộc vào hệ thống. Tôi sẽ chụp ảnh rằng nó sẽ là một nơi nào đó xung quanh dấu 50% (nếu bạn đang sử dụng ít hơn 100 lớp học trong bất kỳ một yêu cầu, tự động tải).

Và việc sử dụng APC có thể sẽ thay đổi điểm hòa vốn gần hơn với các lớp ít hơn (vì vậy không có 100 lớp được sử dụng có thể là điểm hòa vốn, nhưng với 50 lớp được sử dụng). nhưng chỉ làm giảm chi phí của mỗi cá nhân nhỏ hơn bao gồm một chút.

Điểm hòa vốn chính xác sẽ là 100% phụ thuộc vào hệ thống (tốc độ của ổ đĩa I/O, bộ vi xử lý của bạn nhanh đến mức nào, bộ nhớ bao nhiêu, v.v.). Vì vậy, cách duy nhất để biết chắc chắn trên nền tảng của bạn là để kiểm tra.

Tuy nhiên, nhiều rủi ro hơn hiệu suất thô. Khả năng bảo trì sẽ bị ảnh hưởng bởi một tệp lớn vì khó thực hiện nhiều lớp cùng một lúc (các tab trong IDE trở nên vô dụng). Cá nhân tôi sẽ giữ tất cả các lớp trong các tệp riêng biệt và làm cho cuộc sống của tôi trở thành nhà phát triển dễ dàng hơn là tạo ra một quái vật khổng lồ khổng lồ của một tệp.

Bây giờ, nếu bạn có các cấp lưu lượng truy cập facebook, điều đó có thể đáng để nghiên cứu thêm. Nhưng nếu bạn không, cá nhân tôi sẽ không lo lắng về nó ...

+2

Ngoài ra nếu bạn thấy rằng bạn có được tốc độ tăng đáng kể từ việc đặt mọi thứ vào một tệp lớn, bạn có thể tạo một số loại tập lệnh "biên dịch" cho môi trường sản xuất của bạn. Điều này sẽ cho phép bạn hưởng lợi từ việc tăng tốc độ trong khi vẫn có thể duy trì các lớp học trong các tệp riêng lẻ. –

+0

@Wade: Nói dễ hơn làm (nói chung), nhưng hoàn toàn! – ircmaxell

+0

@ircmaxwell: vâng, đồng ý rằng nó sẽ mất nhiều hơn "foreach ($ files as $ f) cat $ f >> onefile.php" Bạn sẽ phải tìm ra một số lược đồ để giữ bao gồm làm việc giữa dev/môi trường thử nghiệm và sản xuất, cũng như một vài thứ khác. –

1

APC sẽ giúp bạn tiết kiệm rất nhiều, nhưng tôi không biết liệu nó sẽ không đáng kể nếu nguồn của bạn là 600k. Đó là khoảng 15000 dòng mã? Không phải là nhiều cho một trang web, nhưng khá lớn cho một tập tin duy nhất.

Bạn muốn sử dụng phương pháp tiếp cận năng động hơn và chức năng riêng biệt riêng biệt trong các lớp cụ thể. Sau đó, đối với mỗi trang, bạn có thể chọn mã nào là cần thiết.

Đặc biệt khi bạn sử dụng APC, cách tiếp cận này sẽ tốt hơn, bởi vì bạn không có chi phí của tệp I/O mà bạn sẽ có khi bạn tải nhiều tệp nhỏ từ đĩa. Tôi sẽ chọn để thực hiện các lớp học nhỏ, được chỉ định và đặt từng lớp trong một tệp riêng biệt. Bạn có thể sử dụng cơ chế tải lớp PHP (__autoload) để tự động tải đúng đơn vị.

Khi bạn tìm ra quy ước đặt tên tốt cho các lớp và đơn vị của bạn, điều này sẽ giúp bạn phát triển dễ dàng hơn nhiều.

12

Tôi đã thực hiện một số thử nghiệm về (các) chi phí khác nhau của php include() mà tôi muốn chia sẻ, khi tôi thấy nhiều người lập trình hoặc nền tảng CMS xem chi phí trước khi chạy php này.

Chi phí của bản thân chức năng khá không đáng kể.100 tập tin bao gồm (với các tập tin trống) chi phí khoảng 5ms; và không quá một micro giây khi sử dụng opcache.

Vì vậy, tiết kiệm chi phí bao gồm tệp php lớn hơn chứa 100 lớp, trái với 100 tệp riêng biệt bao gồm, chỉ khoảng 5ms. Và sử dụng bộ nhớ cache OpCode làm cho chi phí đó không liên quan.

Chi phí thực tế đi kèm với kích thước tệp của bạn và PHP phải phân tích cú pháp và/hoặc biên dịch. Để có ý tưởng tốt hơn về những chi phí đó, đây là kết quả thử nghiệm tôi đã thực hiện trên máy Mac Mini Server 2010, với ổ đĩa 10.000 RPM, chạy PHP 5.3 với trình tối ưu hóa đã bật eCcelerator opcache.

1µs for 100 EMPTY File includes, w/opcache 
5ms for 100 EMPTY File includes, no opcache 

7ms for 100 32KB File includes, w/opcache 
30ms for 100 32KB File includes, no opcache 

14ms for 100 64KB File includes, w/opcache 
60ms for 100 64KB File includes, no opcache 

22ms for 100 128KB File includes, w/opcache 
100ms for 100 128KB File includes, no opcache 

38ms for 100 200KB File includes, w/opcache 
170ms for 100 200KB File includes, no opcache 

Do đó, tệp PHP 600KB có giá khoảng 6ms hoặc khoảng 1ms khi sử dụng bộ nhớ cache opcode. Những gì bạn thực sự muốn xem thay thế là kích thước của tất cả các mã được bao gồm theo yêu cầu.

Việc hợp nhất tệp trong combo để thử và lưu tài nguyên chắc chắn không phải là một ý tưởng hay và sẽ là một sai lầm khi sử dụng bộ đệm ẩn. Bài kiểm tra của tôi không tính đến tốc độ đĩa rất nhiều nếu có, vì tôi đã bao gồm cùng một tệp 100 lần. Điều đó nói rằng tôi không cảm thấy cần phải bao gồm đĩa I/O ở tất cả, bởi vì có một op-cache cài đặt thực sự là một điều kiện tiên quyết về hiệu suất cơ bản.

Để đạt được hiệu suất nhiều nhất có thể và tiết kiệm RAM, người ta phải làm ngược lại. Đó là chia nhỏ các tệp theo ngữ cảnh càng nhiều càng tốt, với việc sử dụng trình nạp tự động hoặc mẫu nhà máy lớp, để bao gồm ít mã không sử dụng nhất có thể cho mỗi và mọi yêu cầu.

mục đích đó, misusing include_once() cũng có thể có những hậu quả thực hiện tiêu cực ...

Liên quan đến các lớp cơ sở của bạn. Tôi có hoàn cảnh tương tự, nhưng tôi chỉ bao gồm một phần nhỏ của lược đồ bảng. Chủ yếu là các loại trường và chi tiết khóa chính. Vì lý do hiệu suất, tôi cố ý không bao gồm lược đồ khá nặng của các bảng mọi lúc, vì chúng hiếm khi được sử dụng và khi chúng được sử dụng, tôi chỉ sử dụng một vài trong số chúng tối đa theo yêu cầu.

Chi tiết cột đầy đủ trung bình của bảng là khoảng 20-50k cho mỗi mảng lược đồ. Bao gồm 10-15 trong số họ trên bất kỳ yêu cầu cho chi phí chỉ khoảng 1-3 ms cho các mảng. Mà trong chính nó, không phải là nhiều. Nhưng nó trở nên đáng giá khi kết hợp với một tiết kiệm 500k RAM cho mỗi yêu cầu.

+4

Cuối cùng, một số thực thay vì lý thuyết. – vatavale

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