2012-07-05 28 views
6

Tôi có một dự án sử dụng nhiều mẫu. Gần đây thời gian biên soạn tăng đột ngột. Tôi tự hỏi nếu có một cách để xem những gì các lớp/dòng yêu cầu thời gian nhất để được biên dịch bởi g + +.gcc hiểu thời gian biên soạn được lấy

Dưới đây là một số đầu ra từ -ftime-báo cáo

Execution times (seconds) 
TOTAL     : 0.30    0.05    0.37    9119 kB 

Execution times (seconds) 
garbage collection : 0.91 (6%) usr 0.00 (0%) sys 0.92 (5%) wall  0 kB (0%) ggc 
callgraph construction: 0.23 (2%) usr 0.11 (3%) sys 0.37 (2%) wall 10652 kB (1%) ggc 
callgraph optimization: 0.18 (1%) usr 0.12 (3%) sys 0.28 (2%) wall 11906 kB (2%) ggc 
varpool construction : 0.04 (0%) usr 0.01 (0%) sys 0.08 (0%) wall 6984 kB (1%) ggc 
cfg construction  : 0.03 (0%) usr 0.00 (0%) sys 0.05 (0%) wall  644 kB (0%) ggc 
cfg cleanup   : 0.05 (0%) usr 0.02 (0%) sys 0.05 (0%) wall  7 kB (0%) ggc 
trivially dead code : 0.05 (0%) usr 0.01 (0%) sys 0.12 (1%) wall  0 kB (0%) ggc 
df scan insns   : 0.37 (3%) usr 0.03 (1%) sys 0.43 (2%) wall  677 kB (0%) ggc 
df live regs   : 0.07 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
df reg dead/unused notes: 0.08 (1%) usr 0.01 (0%) sys 0.08 (0%) wall 2755 kB (0%) ggc 
register information : 0.05 (0%) usr 0.01 (0%) sys 0.05 (0%) wall  0 kB (0%) ggc 
alias analysis  : 0.01 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  878 kB (0%) ggc 
rebuild jump labels : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
preprocessing   : 0.19 (1%) usr 0.44 (11%) sys 0.68 (4%) wall 5284 kB (1%) ggc 
parser    : 3.94 (28%) usr 1.43 (35%) sys 4.94 (27%) wall 355964 kB (48%) ggc 
name lookup   : 1.35 (9%) usr 0.88 (21%) sys 2.76 (15%) wall 64919 kB (9%) ggc 
inline heuristics  : 0.14 (1%) usr 0.03 (1%) sys 0.14 (1%) wall  0 kB (0%) ggc 
integration   : 0.02 (0%) usr 0.00 (0%) sys 0.02 (0%) wall  20 kB (0%) ggc 
tree gimplify   : 0.31 (2%) usr 0.07 (2%) sys 0.28 (2%) wall 24598 kB (3%) ggc 
tree eh    : 0.07 (0%) usr 0.02 (0%) sys 0.11 (1%) wall 7267 kB (1%) ggc 
tree CFG construction : 0.04 (0%) usr 0.04 (1%) sys 0.11 (1%) wall 15754 kB (2%) ggc 
tree CFG cleanup  : 0.12 (1%) usr 0.00 (0%) sys 0.05 (0%) wall  3 kB (0%) ggc 
tree find ref. vars : 0.03 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  963 kB (0%) ggc 
tree PHI insertion : 0.00 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  351 kB (0%) ggc 
tree SSA rewrite  : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall 4078 kB (1%) ggc 
tree SSA other  : 0.03 (0%) usr 0.06 (1%) sys 0.12 (1%) wall 1504 kB (0%) ggc 
tree operand scan  : 0.04 (0%) usr 0.02 (0%) sys 0.08 (0%) wall 10781 kB (1%) ggc 
dominance computation : 0.15 (1%) usr 0.04 (1%) sys 0.15 (1%) wall  0 kB (0%) ggc 
out of ssa   : 0.09 (1%) usr 0.00 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
expand vars   : 0.03 (0%) usr 0.00 (0%) sys 0.03 (0%) wall 1840 kB (0%) ggc 
expand    : 0.45 (3%) usr 0.04 (1%) sys 0.59 (3%) wall 37695 kB (5%) ggc 
post expand cleanups : 0.08 (1%) usr 0.02 (0%) sys 0.06 (0%) wall 4542 kB (1%) ggc 
varconst    : 0.15 (1%) usr 0.03 (1%) sys 0.12 (1%) wall 3595 kB (0%) ggc 
jump     : 0.01 (0%) usr 0.00 (0%) sys 0.04 (0%) wall 1904 kB (0%) ggc 
mode switching  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
integrated RA   : 1.33 (9%) usr 0.09 (2%) sys 1.49 (8%) wall 18163 kB (2%) ggc 
reload    : 0.60 (4%) usr 0.10 (2%) sys 0.62 (3%) wall 8668 kB (1%) ggc 
thread pro- & epilogue: 0.17 (1%) usr 0.00 (0%) sys 0.20 (1%) wall 11884 kB (2%) ggc 
reg stack    : 0.02 (0%) usr 0.00 (0%) sys 0.00 (0%) wall  0 kB (0%) ggc 
final     : 0.71 (5%) usr 0.10 (2%) sys 0.84 (5%) wall 6251 kB (1%) ggc 
symout    : 1.10 (8%) usr 0.16 (4%) sys 1.19 (6%) wall 100954 kB (14%) ggc 
uninit var analysis : 0.03 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
early local passes : 0.00 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
rest of compilation : 0.49 (3%) usr 0.06 (1%) sys 0.76 (4%) wall 19252 kB (3%) ggc 
unaccounted todo  : 0.43 (3%) usr 0.09 (2%) sys 0.55 (3%) wall  0 kB (0%) ggc 
TOTAL     : 14.26    4.11   18.52    742072 kB 
+0

Bạn sẽ cần phải cung cấp nhiều thông tin hơn thế. Thật khó cho chúng tôi để giúp đỡ mà không có bất cứ điều gì để xem xét. – Mysticial

+1

Bạn có thể thử biên dịch các bản sửa đổi khác nhau và xem khi nào tăng thời gian xảy ra; sau đó nhìn vào những thay đổi xảy ra trong bản sửa đổi đó để hy vọng cung cấp cho bạn một số thông tin chi tiết. – mparizeau

+0

Có thể coi trọng chủ đề này http://stackoverflow.com/questions/2072454/how-do-i-find-out-why-g-takes-a-very-long-time -on-a-specific-file –

Trả lời

8

Trình tạo mẫu của Steven Watanabe có thể giúp bạn nhận được số lượng tính toán theo từng lớp/chức năng. Xem Debugging GCC Compile Times để biết liên kết thực tế với công cụ này.

+0

cảm ơn bạn, điều này thực sự có vẻ như những gì tôi đang tìm kiếm! –

+1

Ngoại trừ không có bất kỳ tài liệu nào về cách sử dụng nó. – xaxxon

1

AFAIK, không có công tắc biên soạn như vậy không tồn tại.

Một phương pháp thủ công hơn có thể được phân chia giữa tiền xử lý và biên dịch (gcc -E, sau đó gcc -c trên tệp được xử lý trước) để đoán thời gian được sử dụng.

Một giải pháp khác là thiết lập môi trường xây dựng của bạn để có thời gian biên dịch cho mỗi tệp. Lưu ý rằng tôi chỉ có thể khuyên bạn nên thiết lập tích hợp liên tục để theo dõi diễn biến như vậy sớm (ngay sau khi nó bật lên, bạn phát hiện nó mà không cần phải đào sâu trong quá khứ những gì đã giới thiệu bước nhảy).

Như một quy tắc của ngón tay cái, bạn có thể kiểm tra xem chỉ tiêu đề có liên quan được đưa vào (cố gắng để loại bỏ một số) hoặc có thể chuyển sang tiêu đề biên dịch sẵn,

+0

Cảm ơn bạn rất nhiều. Tôi đã có ý tưởng về các tệp cung cấp thời gian biên dịch dài nhất. Và như bạn đã chỉ ra, đó là những tệp bao gồm hầu hết các tiêu đề. Tôi đã thử với các tiêu đề được biên dịch trước, nhưng không cải thiện tốc độ cao hơn (tôi vẫn không hiểu tại sao). chỉ ccache đã cho tôi một cải tiến tốc độ –

+0

với -Q Tôi nhận được rằng hầu hết thời gian được dành cho trình phân tích cú pháp. Nhưng tôi không có ý tưởng về điều này có nghĩa là gì về mặt mã để nghi ngờ. –

+0

Tùy chọn '-ftime-report' tồn tại trên Mac OS X với'/usr/bin/gcc' - 'i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Dựa trên cấu trúc Apple Inc. 5658) (LLVM xây dựng 2335,15.00) '. Báo cáo đầy đủ hơn có vẻ đến từ '/ usr/bin/clang' -' Apple clang phiên bản 2.1 (thẻ/Apple/clang-163.7.1) (dựa trên LLVM 3.0svn) '. Nó có thể là một lựa chọn để 'clang', hoặc nó có thể chỉ là một lựa chọn trong các phiên bản gần đây của GCC. –

3

Khi tôi đọc mà bạn đã sử dụng hàng loạt các mẫu trong dự án của bạn , nghi ngờ đầu tiên của tôi là mẫu instantiation, và sau khi nhìn thấy các thông tin sau, nghi ngờ của tôi trở nên mạnh mẽ:

parser  : ... (27%) wall 355964 kB (48%) ggc 
name lookup : ... (15%) wall 64919 kB (9%) ggc 

vì tôi không thể nhìn thấy đoạn mã (như bạn đã không đăng nó), vì vậy tôi chỉ có thể nghi ngờ. nghi ngờ thứ hai của tôi là, bạn chưa sử dụng rõ ràng instantiation của các mẫu cho các biết loại (mà bạn chắc chắn sẽ sử dụng), thay vào đó bạn phụ thuộc vào ngầm instantiation bạn đang sử dụng mẫu từ rất nhiều .cpp tập tin. Nếu vậy, thì đó có thể là vấn đề chính, vì ẩn ngụ nguyên nhân tức thời gây ra cùng một mẫu được khởi tạo nhiều lần lần, mỗi lần cho mỗi đơn vị dịch. Vì vậy, nếu bạn có M mẫu và bạn đang sử dụng nó từ N đơn vị dịch (.cpp), thì sẽ có M * N instantiations, thay vì chỉ M instantiations.

+1

Cảm ơn bạn rất nhiều. Đây là trường hợp, các lớp mẫu giống nhau được khởi tạo trong nhiều tệp .cpp. Tôi sẽ cố gắng tìm ra các lớp mẫu yêu cầu nhiều nhất và sửa đổi chúng. –

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