Dường như có rất nhiều cuộc thảo luận về các giá trị tốc độ khác nhau đối với C hoặc C ++ so với nói Java hoặc Python, nhưng tôi hiếm khi thấy Objective-C được đề cập. Nó nằm ở đâu về mặt hiệu suất ngôn ngữ?
Dường như có rất nhiều cuộc thảo luận về các giá trị tốc độ khác nhau đối với C hoặc C ++ so với nói Java hoặc Python, nhưng tôi hiếm khi thấy Objective-C được đề cập. Nó nằm ở đâu về mặt hiệu suất ngôn ngữ?
Câu trả lời:
Không giống như C ++, Objective-C được thiết kế như một siêu bộ lọc sạch của C. Một vài trình biên dịch Objective-C mà tôi đã sử dụng được gọi là trình biên dịch C, nhưng cũng xử lý Objective-C.
Vì vậy, thật an toàn khi giả định rằng ở cấp độ tạo mã, C và Objective-C là tương đương.
Sự khác biệt đầu tiên xuất hiện trong OOP ABI, còn được gọi là "ràng buộc phương thức muộn". Giống như trong C ++, Objective-C dựa vào các bảng con trỏ hàm do trình biên dịch tạo ra được duyệt qua thời gian chạy.
Tuy nhiên, không giống như C ++, phương thức liên kết là 'động' hơn và thúc đẩy việc sử dụng id
siêu lớp ở mọi nơi, làm cho nó chậm hơn một chút so với C ++ trên lý thuyết. Trong thực tế, sự khác biệt này là cách dưới đây có thể đo lường được.
Cuối cùng, vấn đề hiệu suất quan trọng nhất là chất lượng của các thư viện được sử dụng. Vì Objective-C chỉ thực sự phổ biến trong các hệ thống của Apple, nên có lý khi cho rằng bạn đang sử dụng nó với Ca cao; đó là một bộ tốt của các thư viện cấp cao. Trong hầu hết các trường hợp, bạn có thể để lại việc nâng vật nặng cho họ, vì vậy mã của bạn không cần phải quá nhanh hoặc nếu bạn làm việc nặng, thì đó có thể là một cơ sở mã chủ yếu tĩnh, gần giống với C đơn giản .
TL; DR: nó ở ngay đó với các ngôn ngữ C và C ++, nơi nó quan trọng nhất. Nếu bạn không đạt được hiệu suất tốt, hãy kiểm tra các thuật toán của bạn; giống như trong bất kỳ ngôn ngữ nghiêm túc.
Mục tiêu-C chậm hơn C / C ++. Lý do là thời gian chạy của Objective-C gửi các phương thức tra cứu động trong thời gian chạy giống như Smalltalk, từ đó nó đã tiếp quản mô hình thực thi này. Gửi tất cả các phương thức trong thời gian chạy được gọi là "thông điệp thực sự gửi" trái ngược với lệnh gọi hàm trong C / C ++ trong đó địa chỉ hàm được xác định tại thời điểm biên dịch (ngoại trừ các phương thức ảo C ++). Nhưng tôi không thể nói Objective-C chậm hơn bao nhiêu. ASAIK nó chỉ được sử dụng để phát triển ứng dụng vì hình phạt hiệu năng.
Câu trả lời ngắn: Nó được biên dịch thành một định dạng tương tự như C / C ++ / D / Go / Rust. Nó không sử dụng một môi trường ảo như Java / .Net. Và nó không được giải thích như Python / Ruby / Lua / JavaScript. Vì vậy, nó là vào cuối nhanh hơn của quang phổ.
Sự khác biệt về tốc độ cơ bản giữa Obj-C và C / C ++, như Oliver nói dưới đây, là do phương thức động.
Bài viết này mô tả chi phí này trong Obj-C http://it.toolbox.com/bloss/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946
Nó cũng cung cấp một mẹo rất hay để tối ưu hóa mã Obj-C của bạn khi bạn xác định công văn phương thức (tức là objc_msgSend) là yếu tố giới hạn - lấy một con trỏ tới hàm một lần và sử dụng nó để gọi hàm nhiều lần. Nó không nên giúp quá nhiều vì thời gian chạy Obj-C tự động tối ưu hóa này .
Lưu ý rằng chi phí thực sự của việc gửi phương thức động là do lỗi bộ nhớ cache, vì nó phá vỡ dự đoán nhánh CPU. Đây là những hồ sơ khó và có thể là mã được trích dẫn ở trên không đo được chi phí bỏ lỡ bộ đệm thực sự.
Một số thảo luận hữu ích hơn có tại đây: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
Điểm mấu chốt: sự khác biệt lớn nhất giữa các ngôn ngữ là thuật toán của bạn. Ngoài ra, có một sự khác biệt tốc độ cơ bản giữa Obj-C, C và C ++, do gửi phương thức động hoặc ảo. Điểm thứ hai này dường như không lớn. Và bài viết trên đưa ra một mẹo để tối ưu hóa nó, nếu bạn có thể tìm thấy các điểm nóng thông qua hồ sơ, điều này có thể khó khăn do lỗi bộ nhớ cache của CPU.