Trường hợp Objective-C rơi vào sự liên tục hiệu suất ngôn ngữ?


20

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ữ?


23
1986 - Brad Cox và Tom Love tạo ra Objective-C, thông báo "ngôn ngữ này có tất cả sự an toàn về bộ nhớ của C kết hợp với tất cả tốc độ nhanh của Smalltalk." Các nhà sử học hiện đại nghi ngờ hai người mắc chứng khó đọc. ( nguồn )
Mason Wheeler

4
Nó rơi vào phạm vi mà hiệu suất không quan trọng lắm. Đó là ngôn ngữ được hỗ trợ duy nhất để giao tiếp với Ca cao, vì vậy nếu bạn muốn làm điều đó, không có gì khác hoạt động cả. Đối với bất cứ điều gì khác, tôi coi đó là một sự lựa chọn tồi tệ, bất kể hiệu suất.
Jerry Coffin

1
"hiệu suất" không phải là một đặc điểm của ngôn ngữ, mà là triển khai ngôn ngữ và quan trọng hơn là các chương trình được viết bằng ngôn ngữ đó. Bạn có thể viết các chương trình rất nhanh trong Objective-C hoặc bạn có thể viết các chương trình rất chậm.
Caleb

Nó thất bại trong việc có cú pháp gớm ghiếc nhưng nó không phải là một ngôn ngữ hoạt động kém dựa trên các trình biên dịch hiện tại của nó vì hiệu suất dựa trên trình biên dịch / vm nhiều hơn so với ngôn ngữ thực tế.
Giàn khoan

Câu trả lời:


28

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 idsiê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.


4
Trong thực tế, mục tiêu hiện đại-c cũng siêu hơn C ++ hiện đại. Trong C, bạn được phép thực hiện số học trên các con trỏ tùy ý, bạn không thể trong ObjC. Ngoài ra, sự khác biệt về hiệu suất do tra cứu phương thức là có thể đo lường được: đường dẫn nhanh của objc_msgSend nặng hơn khoảng bốn lần so với lệnh gọi hàm thành viên (và đường dẫn chậm không nhanh bằng đường dẫn nhanh).

11

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.


1
Tìm thấy so sánh hiệu suất này với C: rmarcus.info/?p=488 Có vẻ như Objective-C vẫn khá gần với C.
OlliP

Sẽ thật tuyệt khi so sánh Objective C với phần còn lại của gói trong Trò chơi Điểm chuẩn
Deer Hunter

Tôi nghĩ rằng việc so sánh hiệu năng cần phải được thực hiện với một số muối vì mã Objective-C là một số mã C mở rộng và không gửi tin nhắn Objecttive-C. Tôi không biết những gì gây khó chịu cho. Tôi đã phát triển Smalltalk trong hơn một thập kỷ và Objective-C dựa trên Smalltalk theo nhiều cách. Tôi nghĩ rằng biết những gì tôi đã nói về.
OlliP

Không phải là downvoter; chủ yếu quan tâm đến các thuật toán số lượng lớn, công văn động không quan trọng lắm trong số đó.
Deer Hunter

8

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ổ.


7

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.