2012-03-07 41 views
9

Có hiệu suất nào khi gọi mã C từ Mục tiêu-C không?Mã C có chạy nhanh hơn không?

Tôi đã đọc ở đâu đó để gửi thư chậm hơn so với các ngôn ngữ khác sử dụng tính năng gọi điện. Vì vậy, nếu tôi gọi một hàm C từ mã Objective-C, tôi có tránh được phí trên không?

Khi tối ưu hóa hiệu suất, có nên thực hành mã hóa các hàm và thủ tục quan trọng nhất trong C thay vì sử dụng các đối tượng Objective-C không?

EDIT:
Với số lượng câu trả lời cảnh báo về tối ưu hóa sớm và khả năng đọc mã, tôi muốn làm rõ rằng tôi đã không suy nghĩ về các ứng dụng thông thường, nhưng những người rất cụ thể như:

  • Graphics
  • Thuật toán mã hóa hoặc nén.
  • Toán

Và nói chung, chức năng hoặc thủ tục mà không cần phải thiết kế OO và đang dự định sẽ được gọi là nhiều lần với các thông số.

Trả lời

8

Đây là một benchmark so sánh nhắn tin để gọi chức năng C. Đây là kết quả của việc gọi các triển khai khác nhau của hàm fibonacci khoảng 1,4 tỷ lần.

Message Passing 23.495 seconds 
IMP Calling  16.033 seconds 
C Function  9.709 seconds 

Vì vậy, có một số chi phí khi gọi phương thức C mục tiêu. Tuy nhiên, ngoại trừ trong một số trường hợp, đây không phải là điều sẽ tác động đến hiệu suất của ứng dụng của bạn. Trên thực tế, nhắn tin vẫn hiệu quả hơn most other operations chẳng hạn như phân chia dấu phẩy động.

Bên cạnh đó, các ứng dụng đa dành nhiều thời gian nhất chờ đợi cho người dùng nhập vào, tải dữ liệu, vv

+0

Cảm ơn, tôi chuẩn bị đưa ra điểm chuẩn của riêng mình. Tôi biết tôi không nên dùng cách tiếp cận này từ đầu. Tôi đã suy nghĩ về các chức năng được gọi là nhiều lần với nhiều hơn một tham số, ví dụ, các thuật toán mã hóa trọng lượng nặng hoặc raytracing. Điều này có ý nghĩa. –

+1

Cuối cùng tôi đã tạo điểm chuẩn của riêng mình, cũng sử dụng cú pháp đệ quy (nhưng không phải mã được hiển thị trong liên kết).Mục tiêu-C, thậm chí sử dụng kiểu C (dài, int) chậm hơn 2,35 lần so với hàm C. Chắc chắn, mã hóa một số thứ trong C nó cũng đáng xem xét. –

11

Rất có khả năng bạn đang viết mã đủ tối ưu hóa để nút cổ chai được gửi đi. Viết mã của bạn theo cách phù hợp nhất với bạn, sau đó sử dụng Công cụ để lập hồ sơ và tối ưu hóa nếu cần thiết. Hầu như chắc chắn, nếu mã của bạn chậm chạp, nó sẽ là do vấn đề cấp cao hơn nhiều so với gửi tin nhắn.

+0

OpenGL ES được mã hóa bằng C, phải không? Đó là một ví dụ điển hình về loại mã tôi đang nói đến. –

+0

Tối ưu hóa sớm là gốc của tất cả các ác – Saphrosit

+0

OpenGL theo truyền thống trong C, nhưng có hàm bao trong nhiều ngôn ngữ hướng đối tượng, bao gồm Objective-C, hoạt động tốt. Đó là nhiều hơn về những gì bạn muốn mã của bạn trông giống như nhanh như thế nào bạn muốn nó chạy. – andyvn22

1

Thông báo ban đầu được diễn giải tại thời gian chạy và như vậy mất khoảng ba lần dài hơn cuộc gọi phương thức ảo C++ (bản thân nó hơi chậm hơn một cuộc gọi trực tiếp). Tuy nhiên các cuộc gọi tiếp theo là IMP được lưu trong bộ nhớ cache và trong hầu hết các lần triển khai thì nhanh hơn một cuộc gọi phương thức ảo C++, nhưng vẫn hơi chậm hơn một cuộc gọi hàm trực tiếp (trong C hoặc C++). Vì vậy, có thể có hiệu suất đạt được, nhưng trước khi mất tất cả các lợi ích của Mục tiêu-C, bạn nên chắc chắn rằng lợi ích của "tối ưu hóa" là đáng kể. Trong hầu hết các trường hợp, lợi ích hiệu suất cao hơn có thể đạt được ở nơi khác; bằng cách sử dụng các cấu trúc dữ liệu và thuật toán phù hợp chẳng hạn. Hầu hết các mã dành thời gian của nó làm công cụ thay vì chức năng gọi trên không - YMMV.

Xem Objective C message dispatch mechanism

1

Direct C chức năng gọi điện thoại luôn sẽ nhanh hơn gọi một phương thức obj-C; nhưng, như nhiều người đã chỉ ra, ngoại trừ trong mã hiệu suất nhạy cảm nó không có khả năng là một nút cổ chai.

Tuy nhiên, bạn có thể xoay vòng và hỏi tại sao lại sử dụng phương pháp nếu nó chậm hơn? - Sắc lệnh chống lại "tối ưu hóa sớm" không có nghĩa là "viết mã nghèo trên mục đích".

Số dư của nó và đường giữa việc sử dụng phương pháp hoặc hàm có bị mờ hay không, bạn phải lựa chọn. Hai điểm cuối có thể giúp:

  1. Nếu mã sẽ thay đổi trạng thái của đối tượng - hãy sử dụng phương pháp.
  2. Nếu mã là hàm tự nhiên; mất một số đầu vào, tạo ra một đầu ra, không thao tác nhà nước (có "tác dụng phụ"); thì một hàm có ý nghĩa.

Đối với tất cả các điểm giữa việc sử dụng phán đoán của riêng bạn.

Ví dụ: nếu bạn có mã trong lớp cần tính khối lượng của kim tự tháp ở nhiều vị trí, bạn trừu tượng hóa thuật toán khối lượng: phương pháp hoặc hàm? Hàm - phải mất một số giá trị, tạo ra một giá trị, không làm thay đổi trạng thái đối tượng. Có lẽ tốt hơn là làm cho nó trở thành một hàm static, có hiệu quả làm cho nó trở thành riêng tư cho lớp và không gây ô nhiễm không gian tên ứng dụng của bạn. Viết một thuật toán như một phương pháp nếu nó chỉ cần thiết trong nội bộ của lớp học là không có lợi ích - Tôi muốn nói đó là "mã nghèo" để làm như vậy (nhưng đó là một ý kiến ​​!)

4

Có, bạn nên sử dụng đồng bằng C bằng văn bản thay vì sử dụng Objective C bên trong các vòng bên trong quan trọng hiệu suất, chẳng hạn như xử lý tín hiệu âm thanh thời gian thực hoặc mã xử lý hình ảnh. Có ít khi có bất kỳ lợi ích nào khi sử dụng các kiểu dữ liệu đối tượng hoặc nhắn tin khi xử lý hàng nghìn mẫu âm thanh riêng lẻ hoặc hàng triệu điểm ảnh, mỗi khung thời gian. Tất cả các chu trình gửi phương thức không cần thiết chỉ lãng phí thời lượng pin của người dùng. Các loại mô phỏng số phức và mô hình phần tử hữu hạn khác (vv) cũng có thể được hưởng lợi từ việc giữ các vòng bên trong đơn giản cho kết quả tốt nhất từ ​​trình tối ưu hóa trình biên dịch.

Tuy nhiên, nội dung cấp cao hơn chỉ cần xảy ra vài lần cho mỗi sự kiện ở tốc độ của con người có khả năng không tiêu thụ đủ thông báo qua chu kỳ trên không để đo lường được. Vì vậy, bất kỳ abstractions để cải thiện khả năng đọc mã và tái sử dụng ở đây không có khả năng chi phí cho người dùng bất kỳ hiệu suất hoặc tuổi thọ pin.

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