2009-06-23 33 views
8

Tôi muốn thêm một số kiểm tra hiệu năng tự động vào ứng dụng Objective-C của mình. (Đây là một trò chơi, vì vậy mà tôi muốn thấy hiệu suất hiện tại của các bộ phận quan trọng của động cơ bằng cách đơn giản là chạy một bộ kiểm thử.) Để thực hiện điều này, tôi muốn viết một số thời gian hỗ trợ định kỳ, như sau:Mã mục tiêu thời gian-C

- (void) benchmarkSelector: (SEL) msg onObject: (id) target 
{ 
    // run the selector thousands of times, print detailed stats 
} 

Vấn đề là tôi quan tâm đến mili giây và tôi sợ rằng việc gọi performSelector trong mã điểm chuẩn sẽ làm lệch kết quả khá một chút. Làm thế nào bạn sẽ đi xung quanh này? Tôi có nên đi xuống số objc_msgSend không?

+0

là mã cụ thể Cocoa này? – Nippysaurus

+0

Tôi không chắc chắn, có thể là không. – zoul

Trả lời

12

Sử dụng methodForSelector:, mà trả về một con trỏ hàm để thực hiện thực tế, như vậy:

IMP methodImp = [target methodForSelector:msg]; 
for (int i=0; i<1000; ++i) { 
    NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 
    methodImp(target, msg); 

    NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - start; 
    // Do something with duration 
} 

Lưu ý rằng chiến lược này rất hữu ích để đo thời gian chạy thực tế của một phương pháp, nhưng nếu bạn đang đi để được gọi nó với cú pháp thông điệp tiêu chuẩn-C tiêu chuẩn, sau đó nó có thể chỉ là có liên quan để bao gồm chi phí truyền thông điệp trong các phép đo của bạn. Ngoài ra, lưu ý rằng nếu phương pháp thực sự lấy bất kỳ tham số nào khác, bạn nên đưa kết quả của methodForSelector: đến con trỏ hàm với thông số thích hợp, để tránh chuyển đổi không mong muốn của phao để tăng gấp đôi, v.v. Xem NSObject Class Reference để biết thêm thông tin và các ví dụ.

+0

Bạn đúng về việc bao gồm phí chuyển tiếp tin nhắn, nhưng tôi lo lắng rằng performSelector: có thể mất nhiều thời gian hơn là chỉ gửi tin nhắn. Sau khi viết mã nó không có vẻ xấu - và nếu tôi muốn, tôi luôn có thể quay trở lại IMP. Cảm ơn bạn. – zoul

+0

Bạn sẽ không nhận được kết quả tốt hơn nếu bạn sử dụng uint64_t start = mach_absolute_time(); uint64_t duration = mach_absolute_time() - bắt đầu; cung cấp cho bạn nano giây thay vì giây? – micmoo

+2

NSTimeInterval là một đôi. Kết quả được biểu diễn theo số giây, nhưng có độ chính xác dưới miligiây. Vì OP đang tìm kiếm mili giây, tôi nghĩ nó đủ tốt. Nhưng có, mach_absolute_time() cũng sẽ hoạt động. –

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