2012-06-08 25 views
6

Tôi có một chương trình được tạo thành từ nhiều tệp .h và .c và rất nhiều chức năng. Và có các chức năng gọi các chức năng khác và vân vân. Bây giờ, điều này thực sự là một bài tập vì vậy tôi biết bao nhiêu thời gian chương trình cần để đạt được kết thúc.Công cụ để tìm hiểu điều gì đang làm chậm chương trình C?

Vấn đề là, chương trình của tôi mất quá nhiều thời gian so với thời gian tôi được cung cấp. Có thể tìm ra chức năng nào mất quá nhiều thời gian hoặc phần nào của mã đang giữ chương trình không?


Tôi không cung cấp mã ở đây vì quá dài. Tôi biết rằng không ai có thể trả lời tại sao "chương trình của tôi" chậm nhưng tôi nói chung! Có công cụ nào đo lường thời gian mà mỗi chức năng thực hiện hoặc tương tự? Tôi đang sử dụng gcc và tôi đang sử dụng Linux.

+5

Điều này là không thể trả lời. Có tồn tại toàn bộ vũ trụ nguyên nhân gốc rễ và bạn thậm chí còn không cho chúng tôi thấy mã. –

+11

Bạn nên xem [profiling] (https://en.wikipedia.org/wiki/Profiling_%28computer_programming%29). Đây chính xác là quá trình sẽ giải quyết vấn đề của bạn. ('gprof' là một ví dụ về một profiler thường được cài đặt sẵn trên các hệ thống Unix/Linux.) – huon

+3

Bạn thực sự nên xem xét lược tả mã của mình như được chỉ ra bởi @dbaupp. Một số công cụ - valgrind = http://valgrind.org/, gprof = http: //www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html ... http: //oprofile.sourceforge. net/news/= OProfile. GProf là rất tốt trong số họ tôi thường sử dụng nó. – verisimilitude

Trả lời

9

Vì bạn đang sử dụng Linux, có thể bạn đã cài đặt hồ sơ gprof. Việc sử dụng cơ bản nhất của gprof là bằng cách biên dịch với tùy chọn -pg (tùy chọn -g cũng cần thiết để có được thông tin đầu ra). ví dụ.

> gcc -g -pg -o my_executable my_file.c 

Bây giờ, bạn chỉ có thể chạy chương trình của mình bình thường. Sau đó, bạn chạy

> gprof my_executable > profile.txt 

sẽ xuất thông tin định dạng thành profile.txt. Những thông tin này trông hơi giống như

Flat profile: 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
33.34  0.02  0.02  7208  0.00  0.00 open 
16.67  0.03  0.01  244  0.04  0.12 offtime 
16.67  0.04  0.01  8  1.25  1.25 memccpy 
16.67  0.05  0.01  7  1.43  1.43 write 
16.67  0.06  0.01        mcount 
    0.00  0.06  0.00  236  0.00  0.00 tzset 
    0.00  0.06  0.00  192  0.00  0.00 tolower 
    0.00  0.06  0.00  47  0.00  0.00 strlen 
    0.00  0.06  0.00  45  0.00  0.00 strchr 
    0.00  0.06  0.00  1  0.00 50.00 main 
    0.00  0.06  0.00  1  0.00  0.00 memcpy 
    0.00  0.06  0.00  1  0.00 10.11 print 
    0.00  0.06  0.00  1  0.00  0.00 profil 
    0.00  0.06  0.00  1  0.00 50.00 report 

[...] 

và bạn có thể đọc ra một số dữ liệu về từng chức năng (ví dụ open được gọi là 7208 lần và 0.02s đã được chi tiêu thực hiện nó.). Dữ liệu ví dụ đó được mượn từ this guide, mà bạn nên đọc vì nó giải thích nhiều hơn và mô tả cách thao tác lược tả để có được những thứ như lược tả từng dòng.

+0

Cảm ơn bạn rất nhiều. Đây là hoàn hảo! – MinaHany

+0

Có khả năng là tỷ lệ thời gian của các hàm khác nhau sẽ thay đổi nếu bạn không biên dịch với '-g'? – simon

+0

@ simon, tôi không nghĩ rằng nó sẽ tạo ra sự khác biệt lớn, nhưng tôi không chắc chắn. – huon

1

Theo đề xuất của dbaupp ở trên, gprof là một công cụ tuyệt vời cho Linux. Ngoài ra, nếu bạn có quyền truy cập vào IBM Rational Quantify, bạn cũng có thể thử điều đó. Nó là một công cụ thương mại, nhưng cung cấp chế độ xem đồ họa tốt của các chức năng dành nhiều thời gian hơn và lưu lượng cuộc gọi, vv ..

+0

Holy ** $$$$ 7k ** cho một giấy phép người dùng duy nhất! ?? Điều đó làm cho tất cả các công cụ của Microsoft của tôi trông rẻ hơn ... –

+0

Bạn biết điều gì cũng hài hước, đó là 7.7k € chuyển đổi thành hơn 9.6k $ gotta tình yêu bị lung lay như thế. –

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