2012-07-30 20 views
5

dự án của chúng tôi thực sự lớn. kích thước mã nguồn là khoảng 620KLOC trong một mô-đun. Vì vậy, tôi muốn kiểm tra chức năng nào là lớn nhất trong một thư mục/mô-đun? Có công cụ nào có thể hỗ trợ nó không?Công cụ nào có thể hiển thị các câu lệnh tối đa của Phương thức hoặc hàm trong C++?

SourceMonitor chỉ có "Báo cáo trung bình cho mỗi phương thức", không phải báo cáo tối đa cho mỗi phương pháp. CCCC cũng không hỗ trợ.

ví dụ. Chiều dài chức năng này là 1.

unsigned short get() 
{ 
    return 1; 
} 

Cảm ơn.

+0

Tôi nghi ngờ nếu điều này là có thể với các công cụ hiện tại. – iammilind

+0

Clang cung cấp cơ sở hạ tầng gọn gàng để viết các công cụ cấp nguồn khác nhau. Bạn có thể sử dụng nó để phát triển công cụ của riêng bạn. – arrowd

+0

nó sẽ thay đổi nếu bạn đang sử dụng tối ưu hóa – Zaffy

Trả lời

2

dễ nhất điều tôi có thể nghĩ là đang viết kịch bản theo cách của bạn.

  • Sử dụng ví dụ ctags để có được một danh sách các hàm trong file
  • Sử dụng perl/python/awk/grep để chia một file nguồn của bạn thành các file riêng biệt, một tập tin cho mỗi chức năng
  • Đơn giản chỉ cần đếm số dòng của mỗi tệp, có độ dài tối đa. Nếu bạn cần thêm chi tiết, hãy cấp từng tệp vào một máy đếm cục bộ, ví dụ: sloccount đến
    nhận thêm thông tin tinh tế. Sử dụng grep một lần nữa để nhận được đầu ra bạn là quan tâm đến

Một công cụ có thể được giúp đỡ:

Lazy C++: Liệu là một bộ tạo mã để tách file rất giống với C++ vào header và nguồn. Nếu bạn viết bạn chuyển đổi mã của bạn thành một tập tin lzz mã được tạo ra bao gồm các thẻ truy cập dòng cho mỗi chức năng. Sự khác biệt trong những con số này sẽ cho bạn biết mức độ lớn của các chức năng của bạn là

+1

thay vì chia nhỏ thành các tệp khác nhau, tôi khuyên bạn nên sử dụng ctags có -x, trong số dòng đầu ra có thể đọc được của con người. sắp xếp theo chúng, và dễ tính toán các dòng (số đó chỉ xấp xỉ., nhưng phải đủ để tìm số lớn nhất) cho mỗi hàm – flolo

+0

Tôi không sử dụng ctags trước đây. Tôi sẽ xem phần giới thiệu và cố gắng hiểu nó. – liuzw

+0

đường nối điện cực thực sự mạnh mẽ. Flolo và Martin, bạn có quen thuộc với nó không? bạn có thể đưa ra các lệnh để hỗ trợ các yêu cầu của tôi không? Cảm ơn rất nhiều – liuzw

0

Tôi nghĩ rằng nhiều công cụ phân tích tĩnh có thể không cung cấp cho bạn những gì bạn cần. được kéo vào bởi các tiêu đề được biên dịch sẵn) và các đặc tính tạo mã của trình biên dịch.

Tôi đã gặp phải sự cố tương tự trong quá khứ, với tệp thực thi lớn có kích thước bị chi phối bởi một thư viện cụ thể. Cách tôi nhận được để dưới cùng của nó chỉ đơn giản là để xem kích thước của các tập tin đối tượng cho mỗi .cpp. Điều đó sẽ không cung cấp cho bạn những câu chuyện đầy đủ như là mối liên kết sẽ tối ưu hóa phần không sử dụng (mặc dù nó có giá trị kiểm tra bạn đã có tùy chọn thiết lập - /OPT:REF cho Visual Studio). Nó sẽ mặc dù cho phép bạn tập trung tìm kiếm của bạn. Tìm hai hoặc ba tệp đối tượng lớn nhất và sau đó xem các tệp .cpp tương ứng. Sau đó, bạn có hai tùy chọn - viết một kịch bản có đầu ra là objdump (VisualStudio) hoặc nm -C (gcc), nơi bạn có thể trích xuất bù của từng chức năng trong mô-đun, để bạn có thể phân biệt chúng với ý tưởng trước đó kích thước của từng chức năng.

Hoặc phương pháp đơn giản nhất là sử dụng tìm kiếm nhị phân trên tệp cpp. # definexóa tất cả các mã sau khi kết thúC#includes và biên dịch nó. Điều đó sẽ cung cấp cho bạn một ý tưởng về chi phí bao gồm (nếu chính nó là rất lớn, sau đó bạn có thể đi sâu vào các vùi tiêu đề để tìm thấy những đóng góp nhiều nhất). Tiếp theo, vô hiệu hóa mỗi nửa mã bằng #ifdef và tìm một nửa là số lớn hơn. Sử dụng phương pháp này bạn có thể nhanh chóng tìm thấy các chức năng đóng góp nhiều nhất vào kích thước của thư viện.

Trong trường hợp thư viện mà tôi có cùng vấn đề này, nguyên nhân hóa ra là một chức năng khuôn mẫu rất lớn được khởi tạo mỗi lần biến thành viên được lưu. Giải pháp trong trường hợp đó là làm cho hàm bê tông sao cho tất cả các mã không yêu cầu hành vi kiểu cụ thể chỉ được khởi tạo một lần và các hàm mẫu được bản địa hóa cho các bit logic là kiểu cụ thể.

+0

Công cụ phân tích tĩnh là đủ cho tôi. Chúng tôi có thể bỏ qua mã mẫu vì mã mẫu của chúng tôi nhỏ. Một số phương thức C++ "bình thường" của chúng tôi có hơn 600 dòng mã. Và tôi không nghĩ rằng kích thước tệp đối tượng có thể nhận được các dòng mã phương thức ngoại trừ một tệp có một phương thức. Nhưng điều đó không đúng đối với chúng tôi. – liuzw

0

CppDepend cung cấp cho bạn thông tin này, nó dựa trên Clang và với CQLinq bạn có thể yêu cầu mã của bạn như bạn muốn.

1

Bạn có thể quét dự án của mình bằng công cụ SourceMeter và theo nhu cầu của bạn, tệp CSV chứa các hàm/phương pháp có chỉ số (trong số các chỉ số kích thước khác bạn đang tìm kiếm) và mô-đun có chứa (ví dụ: thư viện, đối tượng được chia sẻ, thực thi). Sử dụng trình chỉnh sửa bảng tính, bạn có thể dễ dàng tìm thấy các hàm/phương thức lớn nhất trên mỗi mô-đun.

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