2010-04-21 37 views
11

Một trong những thứ chặn các đối tượng, được giới thiệu trong Snow Leopard, rất tốt cho các tình huống mà trước đó đã được xử lý với các cuộc gọi lại. Cú pháp này sạch hơn nhiều khi đi qua ngữ cảnh xung quanh. Tuy nhiên, tôi chưa thấy bất kỳ thông tin nào về tác động của việc sử dụng các khối theo cách này. Điều gì, nếu có, cạm bẫy hiệu suất nên tôi tìm cho ra khi sử dụng các khối, đặc biệt là một sự thay thế cho một cuộc gọi lại kiểu C?Sự khác biệt hiệu suất giữa các khối và gọi lại là gì?

Trả lời

11

Thời gian chạy của khối trông khá chặt chẽ. Các bộ mô tả và chức năng chặn được phân bổ tĩnh, vì vậy chúng có thể phóng to bộ làm việc của chương trình của bạn, nhưng bạn chỉ "trả" trong bộ nhớ cho các biến mà bạn tham chiếu từ phạm vi kèm theo. Các khối không theo khối toàn cầu và các biến số __block được xây dựng trên ngăn xếp mà không có bất kỳ nhánh nào, do đó, bạn không thể gặp phải nhiều sự chậm lại từ đó. Gọi một khối chỉ là result = (*b->__FuncPtr)(b, arg1, arg2); điều này có thể so sánh với result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

Nếu bạn nghĩ rằng các khối là "callbacks viết cấu trúc ngữ cảnh của riêng họ và xử lý đóng gói xấu, quản lý bộ nhớ, truyền và dereferencing cho bạn", tôi nghĩ bạn sẽ nhận ra rằng các khối là một chi phí nhỏ trong thời gian chạy và tiết kiệm rất lớn trong thời gian lập trình.

6

Bạn có thể muốn xem this blog postthis one. Các khối được thực hiện như các đối tượng Objective-C, ngoại trừ chúng có thể được đặt trên stack, vì vậy chúng không nhất thiết phải là malloc 'd (nếu bạn giữ một tham chiếu đến một khối, nó sẽ được sao chép vào heap) . Do đó, chúng có thể hoạt động tốt hơn hầu hết các đối tượng Objective-C, nhưng sẽ có hiệu suất nhỏ hơn so với một cuộc gọi lại đơn giản - tôi đoán nó không phải là vấn đề 95% thời gian.

+0

Cuộc gọi tốt trên các bài đăng của Mike Ash. – Don

+0

một điều cũng đề cập đến là cơ chế chụp với các khối so với callbacks. –

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