2012-12-14 31 views
7

OK, đây là những gì tôi muốn:Các phương thức lớp VS Các hàm tĩnh lớp VS Các hàm đơn giản - Hiệu năng-khôn ngoan?

  • Tôi đã viết một số chức năng thực sự đòi hỏi (chủ yếu hoạt động trên bitmap, vv) mà phải càng nhanh càng tốt
  • Bây giờ, chúng ta hãy cũng đề cập rằng những các hàm cũng có thể được nhóm theo loại hoặc thậm chí theo loại biến mà chúng hoạt động.
  • Và vấn đề là, ngoài việc thực hiện rất nhiều thuật toán, tôi nên làm gì - từ quan điểm kỹ thuật - để không làm hỏng tốc độ.

Và bây giờ, tôi đang xem xét các tình huống sau:

  • Tạo họ hoạt động như đơn giản và chỉ cần vượt qua các thông số cần thiết như các đối số
  • Tạo một lớp (cho 'nhóm'/mục đích tổ chức) và chỉ tuyên bố chúng là tĩnh
  • Tạo lớp theo loại, ví dụ Tạo một lớp để làm việc trên bitmap, tạo một đối tượng mới của lớp đó cho mỗi bitmap (ví dụ Bitmap* myBitmap = newBitmap(1010);, và hoạt động trên nó với các phương pháp bên trong của nó (ví dụ myBitmap->getFirstBitSet())

Bây giờ, mà những phương pháp tiếp cận là nhanh nhất? có thực sự bất kỳ sự khác biệt giữa các chức năng thẳng đơn giản và class-đóng gói static chức năng, hiệu suất-khôn ngoan Bất kỳ kịch bản khác đó sẽ là một lợi thế, mà tôi đã không được đề cập


Sidenote:? tôi đang sử dụng trình biên dịch clang++, dành cho Mac OS X 10. 6.8. (nếu điều đó tạo ra bất kỳ sự khác biệt nào)

+0

Đã cố định hồ sơ? –

+1

Nếu bạn thực sự quan tâm về hiệu suất, Bạn nên cấu hình cả hai phiên bản bạn đề xuất trên envrionment của bạn. Đó là cách bạn nhận được một chẩn đoán tốt hơn là meere đoán mà câu trả lời ở đây sẽ cung cấp cho bạn. –

+0

@ LuchianGrigore + AlokSave Thành thật mà nói, không, tôi chưa chạy bất kỳ bài kiểm tra hồ sơ nào. Vâng, tôi biết một số điều tốt hơn để được chẩn đoán dựa trên môi trường chính xác mà họ cho là đang chạy; Tôi đoán tôi cần một số ý kiến ​​về một số bit của lý thuyết đằng sau tình trạng khó xử của tôi, tôi có thể bị mất tích. * (ví dụ, mặc dù tôi đã xem xét nó, có thể tạo lớp và gọi phương thức nhanh hơn một cuộc gọi chức năng đơn giản? Vẫn đoán ... mặc dù tôi nghĩ tôi đoán đúng ...) * –

Trả lời

14

Ở cấp CPU, chỉ có one kind of function và rất nhiều lần lắp lại loại C. Bạn có thể tự làm thủ công, nhưng ...

Khi nó quay ra, C++ được xây dựng với tiêu chí hiệu quả ánh xạ hầu hết các chức năng trực tiếp đến gọi hướng dẫn:

  • một hàm mức namespace giống như một hàm C thường xuyên
  • một phương pháp tĩnh là như hàm mức không gian tên (từ điểm gọi)
  • phương pháp không tĩnh rất giống với phương pháp tĩnh, ngoại trừ tham số this tiềm ẩn được truyền trên đầu các thông số khác (một con trỏ)

Tất cả 3 loại đó đều có cùng một loại hiệu suất.

Mặt khác, các phương thức virtual có chi phí nhỏ. Đã có một báo cáo kỹ thuật C++ về hiệu suất ước tính chi phí so với phương pháp không ảo từ 10% đến 15% (từ bộ nhớ) cho các chức năng trống. Có nghĩa là đối với bất kỳ chức năng nào có thịt bên trong (ví dụ, thực hiện công việc thực tế), chính bản thân nó gần như bị mất trong tiếng ồn. Chi phí thực tế đến từ sự ức chế nội tuyến trừ khi cuộc gọi virtual có thể được suy ra tại thời gian biên dịch.

+0

Cảm ơn rất nhiều! ;-) –

3

Hoàn toàn không có sự khác biệt giữa các hàm C cũ cổ điển và các phương thức tĩnh của các lớp. Sự khác biệt chỉ là thẩm mỹ. Nếu bạn có nhiều hàm C có mối quan hệ nhất định giữa chúng, bạn có thể:

  • nhóm chúng thành một lớp;
  • đặt chúng vào không gian tên;

Sự khác biệt sẽ lại mang tính thẩm mỹ. Nhiều khả năng điều này sẽ cải thiện khả năng đọc.

Tôi sẽ không khuyến khích bạn tạo một phiên bản giả. Điều này sẽ gây hiểu nhầm cho người đọc mã nguồn.

Tạo cá thể cho mỗi bitmap là có thể và thậm chí có thể thuận lợi. Đặc biệt nếu bạn sẽ gọi các phương thức trên cá thể này nhiều lần trong một kịch bản điển hình.

+0

Cảm ơn rất nhiều, bạn thân! ;-) –

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