2014-04-11 13 views
6

Tôi có một chức năng tiện ích mà tôi nghi ngờ đang chiếm một phần lớn thời gian thực hiện của ứng dụng của tôi. Sử dụng Time Profiler để xem stack cuộc gọi, hàm này chiếm một phần lớn thời gian thực thi của bất kỳ hàm nào mà nó được gọi. Tuy nhiên, vì chức năng tiện ích này được gọi từ nhiều nguồn khác nhau, tôi gặp khó khăn khi xác định xem, tổng thể, đây là cách sử dụng tốt nhất thời gian tối ưu hóa của tôi.Làm thế nào để đo tổng thời gian chi tiêu trong một chức năng?

Làm cách nào tôi có thể xem tổng thời gian dành cho chức năng này trong quá trình thực hiện chương trình, bất kể ai đã gọi nó?

Để rõ ràng, tôi muốn kết hợp các mục được lựa chọn với tất cả các cuộc gọi khác đến chức năng đó vào một mục duy nhất: Profiler Log

+0

Bạn có phải linh hoạt và sẽ thêm một số mã vào chức năng thủ phạm và đăng nhập các kết quả trong trình gỡ lỗi hoặc bạn muốn một giải pháp chỉ có công cụ? – SayeedHussain

+0

@paranoidcoder: Tôi có thể thêm mã, mặc dù tôi rất thích giải pháp chỉ dành cho dụng cụ. – user664939

Trả lời

2

Tôi không nhận thức được một công cụ giải pháp dựa trên nhưng đây là một cái gì đó bạn có thể làm từ mã . Hy vọng ai đó cung cấp một giải pháp công cụ nhưng cho đến khi đó để giúp bạn đi đây.

#include <time.h> 

//have this as a global variable to track time taken by the culprit function 
static double time_consumed = 0; 

void myTimeConsumingFunction(){ 
//add these lines in the function 
clock_t start, end; 

start = clock(); 
//main body of the function taking up time 
end = clock(); 

//add this at the bottom and keep accumulating time spent across all calls 
time_consumed += (double)(end - start)/CLOCKS_PER_SEC; 
} 

//at termination/end-of-program log time_consumed. 
+0

+1, cảm ơn sự giúp đỡ. Tôi sẽ tiếp tục chấp nhận bây giờ, mặc dù, vì tôi vẫn hy vọng có một cách bên trong Dụng cụ. – user664939

1

tôi có thể cung cấp dấu hiệu của câu trả lời bạn đang tìm kiếm nhưng chưa có làm việc này trong vòng Instruments chưa ...

Instruments sử dụng dtrace dưới mui xe. dtrace cho phép bạn trả lời các sự kiện trong chương trình của bạn, chẳng hạn như chức năng được nhập hoặc trả về. Câu trả lời cho mỗi sự kiện có thể được viết kịch bản.

Bạn có thể create a custom instrument với tập lệnh trong Công cụ.

Dưới đây là một kịch bản lệnh nút shell khởi chạy dtrace bên ngoài Công cụ và ghi lại thời gian đã sử dụng trong một hàm nhất định.

#!/bin/sh 

dtrace -c <yourprogram> -n ' 

unsigned long long totalTime; 
self uint64_t lastEntry; 

dtrace:::BEGIN 
{ 
    totalTime = 0; 
} 

pid$target:<yourprogram>:*<yourfunction>*:entry 
{ 
    self->lastEntry = vtimestamp; 
} 

pid$target:<yourprogram>:*<yourfunction>*:return 
{ 
    totalTime = totalTime + (vtimestamp - self->lastEntry); 
    /*@timeByThread[tid] = sum(vtimestamp - self->lastEntry);*/ 
} 

dtrace:::END 
{ 
    printf("\n\nTotal time %dms\n" , totalTime/1000000) 
} 
' 

Điều tôi chưa tìm ra là cách chuyển công cụ này thành công cụ và nhận kết quả xuất hiện một cách hữu ích trong GUI.

2

Để xem tổng số của một chức năng cụ thể, hãy làm theo các bước sau:

  1. hồ sơ chương trình của bạn với Time Profiler
  2. Tìm và chọn bất kỳ đề cập đến chức năng quan tâm trong quan điểm Gọi Tree (bạn có thể sử dụng Edit-> Tìm)
  3. Triệu hồi menu ngữ cảnh trên các chức năng được lựa chọn và 'Tập trung vào các cuộc gọi được thực hiện bởi' (Hoặc sử dụng Instrument-> gọi Tree liệu Mining-> Tập trung vào các cuộc gọi Made by)

Nếu chương trình của bạn là đa luồng và bạn muốn tổng cộng trên tất cả các chủ đề, hãy chắc chắn rằng 'Tách theo Chủ đề' không được chọn.

6

Đối với tôi, mẹo đánh dấu là "Đảo ngược cây cuộc gọi" là gì. Có vẻ như sắp xếp các chức năng "lá" trong cây gọi theo thứ tự tích lũy thời gian nhất và cho phép bạn xem những gì gọi chúng.

Hộp kiểm có thể được tìm thấy trong bảng bên phải, được gọi là "Display Settings" (Nếu ẩn: ⌘2 hoặc View-> Inspectors-> Hiển thị Display Settings)

0

Tôi nghĩ rằng bạn có thể gọi hệ thống ("thời gian ls "); hai lần và nó sẽ chỉ làm việc cho bạn. Đầu ra sẽ được in trên bảng điều khiển gỡ lỗi.

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