Tôi tò mò muốn biết về chi phí gửi tin nhắn trong Objective-C trong các tình huống khác nhau. Đặc biệt tôi muốn hướng dẫn lựa chọn thiết kế chương trình của mình vì vậy tôi không bị cám dỗ để tối ưu hóa sớm bằng cách tránh các thông báo gửi đi khi họ tạo ra một thiết kế tốt hơn.Chi phí gửi tin nhắn trong mục tiêu-C
Trường hợp trong dự án hiện tại của tôi là tôi có một lớp với các biến mẫu: offsetX và offsetY. Tôi thường muốn tuyệt đối bù đắp và tại thời điểm này tôi có dòng mã này ở khắp mọi nơi: -
int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
Bây giờ nếu điều này là C++ tôi sẽ tạo ra một hàm nội tuyến đó quay trở lại giá trị cho absOffset. Ngay cả trong Java/C# tôi có thể xác định một chức năng như là cuối cùng/niêm phong và được khá chắc chắn nó sẽ được inlined.
Mục tiêu-C sẽ là: -
-(int)absOffset {
return ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
}
và tôi sẽ gọi nó là như vậy: -
int ao = [self absOffset];
Bây giờ, là trình biên dịch có thể nội tuyến đó? Tôi cho rằng nó ít nhất có thể sửa chữa nó thành một cuộc gọi hàm trực tiếp và tránh gửi thông điệp động (mà tôi giả định) mà mục tiêu-c phải sử dụng vì hệ thống kiểu của nó.
Ngoài ra, nhìn chung, chi phí chuyển thư trong mục tiêu-C là bao nhiêu? Nó có khác khi gọi qua 'id' so với một con trỏ tới một lớp cụ thể không?
+1. Điều đáng nói là mã nhắn tin được viết bằng mã lắp ráp được tối ưu hóa cao, nằm ở đây: http://opensource.apple.com/source/objc4/objc4-371.2/runtime/Messengers.subproj/ –
Tôi ' m gãi đầu vào số của Mike Ash về chi phí op. Tôi chạy một phép đo tương tự của C + + gọi điện thoại ảo trên không, và thời gian tôi nhận cho mỗi gián tiếp ảo trên một bộ xử lý 3.3GHz giống như 7ns hơn 1. – Crashworks
Theo liên kết đăng một cuộc gọi chức năng ảo mất 1,1ns trong khi một Mục tiêu- C công văn mất 4.9ns - chậm hơn gần 5 lần. Nhanh như người điều phối được cho là có thể vẫn là một cú đánh hoàn hảo trong hoàn cảnh thích hợp. Tôi chắc chắn đồng ý về việc tránh tối ưu hóa sớm! – fbrereto