Chúng tôi đã phát triển một ứng dụng tài chính lớn tại một ngân hàng. Nó bắt đầu là 150k dòng mã thực sự xấu. Bởi 1 tháng trước, nó đã giảm xuống còn hơn một nửa, nhưng kích thước của tập tin thực thi vẫn còn rất lớn. Tôi hy vọng rằng khi chúng tôi chỉ làm cho mã dễ đọc hơn, nhưng mã templated vẫn còn tạo ra rất nhiều mã đối tượng, chúng tôi đã chỉ được hiệu quả hơn với nỗ lực của chúng tôi.thực thi rất lớn vì các biểu tượng gỡ lỗi, tại sao?
Ứng dụng được chia thành khoảng 5 đối tượng được chia sẻ và một đối tượng chính. Một trong những đối tượng chia sẻ lớn hơn là 40Mb và tăng lên 50 ngay cả khi mã bị thu hẹp.
Tôi không hoàn toàn ngạc nhiên khi mã bắt đầu phát triển, bởi vì sau khi tất cả chúng tôi đang thêm một số chức năng. Nhưng tôi đã ngạc nhiên rằng nó đã tăng 20%. Chắc chắn không có ai đến gần bằng văn bản 20% mã, vì vậy thật khó cho tôi để tưởng tượng nó phát triển như thế nào nhiều. Mô-đun đó rất khó phân tích, nhưng vào thứ Sáu, tôi có một điểm dữ liệu mới cho thấy một số ánh sáng.
Có thể có 10 nguồn cấp dữ liệu cho máy chủ SOAP. Mã được tự động phát hiện. Mỗi dịch vụ có một lớp trình phân tích cú pháp có cùng mã chính xác, giống như sau:
#include <boost/shared_ptr.hpp>
#include <xercesstuff...>
class ParserService1 {
public:
void parse() {
try {
Service1ContentHandler*p = new Service1ContentHandler(...);
parser->setContentHandler(p);
parser->parser();
} catch (SAX ...) {
...
}
}
};
Các lớp này hoàn toàn không cần thiết, một hàm hoạt động. Mỗi lớp ContentHandler đã được tạo tự động với cùng 7 hoặc 8 biến, mà tôi có thể chia sẻ với thừa kế.
Vì vậy, tôi đã mong đợi kích thước của mã giảm xuống khi tôi xóa các lớp trình phân tích cú pháp và tất cả từ mã. Nhưng chỉ với 10 dịch vụ, tôi đã không mong đợi nó giảm từ 38Mb xuống 36Mb. Đó là một số lượng lớn các biểu tượng. Điều duy nhất tôi có thể nghĩ là mỗi phân tích cú pháp bao gồm tăng :: shared_ptr, một số công cụ phân tích cú pháp Xerces, và bằng cách nào đó, trình biên dịch và trình liên kết lưu trữ tất cả các ký hiệu đó lặp lại cho mỗi tệp. Tôi tò mò muốn tìm hiểu trong mọi trường hợp.
Vì vậy, bất cứ ai có thể đề xuất cách tôi sẽ đi về việc theo dõi lý do tại sao một sửa đổi đơn giản như thế này sẽ có tác động rất nhiều? Tôi có thể sử dụng nm trên một mô-đun để nhìn vào các biểu tượng bên trong, nhưng điều đó sẽ tạo ra một lượng lớn các công cụ bán dễ đọc.
Ngoài ra, khi một đồng nghiệp chạy mã của cô ấy bằng thư viện mới của tôi, thời gian của người dùng đã tăng từ 1m55 giây lên 1m25 giây. Thời gian thực là rất khác nhau, bởi vì chúng tôi đang chờ đợi trên các máy chủ SOAP chậm (IMHO, SOAP là một thay thế vô cùng nghèo cho CORBA ...) nhưng thời gian CPU là khá ổn định. Tôi đã có thể mong đợi một chút tăng từ việc giảm kích thước mã nhiều, nhưng điểm mấu chốt là, trên một máy chủ với bộ nhớ lớn, tôi đã thực sự ngạc nhiên rằng tốc độ đã bị ảnh hưởng rất nhiều, xem xét tôi đã không thay đổi kiến trúc của Tự xử lý XML.
Tôi sẽ tiến xa hơn vào thứ ba và hy vọng sẽ nhận được nhiều thông tin hơn, nhưng nếu có ai đó có ý tưởng về cách tôi có thể cải thiện nhiều điều này, tôi rất muốn biết.
Cập nhật: Tôi xác minh rằng trên thực tế, việc gỡ lỗi biểu tượng trong tác vụ dường như không thay đổi thời gian chạy. Tôi đã làm điều này bằng cách tạo một tệp tiêu đề bao gồm rất nhiều nội dung, bao gồm cả hai tệp có tác dụng ở đây: tăng các con trỏ được chia sẻ và một số trình phân tích cú pháp XML xerces. Dường như không có hiệu suất thời gian chạy (tôi đã kiểm tra vì có sự khác biệt về ý kiến giữa hai câu trả lời). Tuy nhiên, tôi cũng xác minh rằng bao gồm các tệp tiêu đề tạo các biểu tượng gỡ lỗi cho từng trường hợp, mặc dù kích thước nhị phân bị tước không thay đổi. Vì vậy, nếu bạn bao gồm một tệp nhất định, ngay cả khi bạn thậm chí không sử dụng nó, có một số biểu tượng cố định phản đối đối tượng đó không được gấp lại với nhau tại thời gian liên kết mặc dù chúng có lẽ giống hệt nhau.
Mã của tôi trông giống như:
#include "includetorture.h"
void f1()
{
f2(); // call the function in the next file
}
Kích thước với riêng tôi bao gồm các file khoảng 100k mỗi nguồn tập tin. Có lẽ, nếu tôi đã bao gồm nhiều hơn, nó sẽ cao hơn. Tổng số thực thi với các bao gồm là ~ 600k, mà không có khoảng 9k. Tôi đã xác minh rằng sự tăng trưởng là tuyến tính với số lượng tệp đang thực hiện bao gồm, nhưng mã bị tước có cùng kích thước bất kể, vì nó phải như vậy.
Rõ ràng tôi đã nhầm tưởng rằng đây là lý do để đạt được hiệu suất. Tôi nghĩ rằng tôi đã chiếm được điều đó ngay bây giờ. Mặc dù tôi không loại bỏ nhiều mã, nhưng tôi đã sắp xếp rất nhiều quy trình xử lý chuỗi xml lớn và giảm đường dẫn thông qua mã đáng kể và đó có thể là lý do.
cảm ơn chỉnh sửa Magnus! – Dov
Trong tiêu đề của bạn, bạn đề cập đến các biểu tượng gỡ lỗi, nhưng bạn không nằm trong phần còn lại của bài đăng. Tui bỏ lỡ điều gì vậy? – Bart
@Bart Các bloat là vì tất cả các biểu tượng gỡ lỗi trong thực thi. Nếu bạn loại bỏ các thư viện, mã là khoảng 10% kích thước. – Dov