2009-08-04 7 views
6

Chúng tôi sử dụng g ++ 4.2.4 và tôi đang cố gắng theo dõi một số vấn đề về hiệu suất trong mã của mình.Chức năng __tcf_0 là gì? (Xem khi sử dụng gprof và g ++)

Tôi đang chạy gprof để tạo hồ sơ cá nhân, và tôi nhận được sau "lạ" trong đó các chức năng đắt nhất là __tcf_0:

Each sample counts as 0.01 seconds. 
% cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
40.00  0.04  0.04  1 40.00 95.00 __tcf_0 

Chức năng này sau đó xuất hiện để gọi hầu hết người dùng của tôi các hàm (nghĩa là nó được gọi từ chính). Lời giải thích gần nhất mà tôi tìm thấy cho điều này là here, nhưng liên kết đó đề cập đến các đối tượng tĩnh và ngoại tuyến, và tôi không nghĩ rằng điều này áp dụng trong trường hợp của tôi.

Nếu nó hữu ích, tôi đang sử dụng Boost (program_options và fusion) và thư viện HDF5.

UPDATE:

Lệnh tôi sử dụng khi xây dựng là:

g++ -Wreturn-type -Wunused -Winline -pg -DLINUX -DHAS_SETENV \ 
    -DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15 -g -O0 \ 
    --param large-function-growth=300 --param inline-unit-growth=200 

Trả lời

3

__tcf_0 dường như thực sự là một chức năng trong đó kêu gọi destructor của các đối tượng tĩnh và được đăng ký cho mỗi đối tượng tĩnh, để được gọi tại lối ra (lấy cho những gì được cho là trên this page)

Bây giờ, kết quả của gprof của bạn khá lạ, vì chức năng hầu như chỉ mất thời gian es 0,04 giây, có nghĩa là toàn bộ chương trình mất 0,1 giây để thực thi. Nếu tôi không nhầm, tôi đoán là bạn đã không chính xác. Bạn đã biên dịch mã của mình với tính năng hồ sơ được bật chưa?

+0

Tôi đã thêm lệnh xây dựng mà chúng tôi sử dụng cho câu hỏi. Chúng tôi có một hệ thống xây dựng khá linh hoạt và điều này đang sử dụng cấu hình "gprof" đặc biệt mà tôi đã sử dụng với thành công trong quá khứ. Vì vậy, về nguyên tắc tôi * nghĩ * Tôi có tất cả các thiết lập cần thiết. –

+0

Cả hai câu trả lời khá nhiều đều đúng - nhưng đại diện có lẽ hữu ích hơn cho bạn. –

5

g ++ tạo các chức năng với tên này. Chúng gọi là destructor của các đối tượng tĩnh và được đăng ký với atexit() khi hàm tạo được gọi.