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
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.
Bạn có thể muốn xem this blog post và this 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.
- 1. Sự khác biệt giữa móc và gọi lại là gì?
- 2. Sự khác biệt giữa "gọi" và "gọi" là gì?
- 3. Sự khác biệt lớn giữa các nhà quan sát và các cuộc gọi lại là gì?
- 4. Sự khác biệt giữa một hộp cấp khối và hộp cấp khối chính là gì?
- 5. Sự khác biệt giữa is_a và instanceof là gì?
- 6. Sự khác biệt giữa while (true) và loop là gì?
- 7. Sự khác biệt giữa (string [] args) và System.Environment.CommandLine là gì?
- 8. Sự khác biệt giữa NSInvocation và chặn là gì?
- 9. Sự khác biệt giữa việc gói một khối thử cuối cùng với khối thử-trừ và ngược lại là gì?
- 10. Sự khác biệt giữa khối và khối trong Ruby
- 11. Hiệu suất khác biệt giữa Innodb và Myisam trong Mysql
- 12. Sự khác biệt giữa Caching và Memoization là gì?
- 13. Sự khác biệt giữa tải Google API qua gọi lại hoặc google.load hoặc khối tập lệnh đơn giản là gì?
- 14. Sự khác biệt giữa RadGrid.Rebind() và RadGrid.MasterTableView.Rebind() là gì?
- 15. Sự khác biệt giữa năng suất bằng Python và hiệu suất trong C#
- 16. Sự khác biệt giữa Gọi() và BeginInvoke()
- 17. sự khác biệt giữa phương pháp ngủ và phương pháp năng suất đa luồng là gì?
- 18. Sự khác nhau về hiệu suất giữa HttpModule và Global.aspx là gì?
- 19. Trong Ember.js, sự khác biệt giữa [] và Ember.A ([]) là gì?
- 20. Sự khác biệt giữa đúc và co giật là gì?
- 21. Sự khác biệt giữa Thông báo và pynotify là gì?
- 22. Sự khác biệt giữa .closest() và .parents ('selector') là gì?
- 23. Sự khác biệt giữa "new A()" và "A.newInstance()" là gì?
- 24. Sự khác biệt giữa các quy ước gọi C và C++ là gì?
- 25. SQLAlchemy: Sự khác biệt giữa flush() và commit() là gì?
- 26. Hiệu suất khác biệt giữa IIf() và Nếu
- 27. Sự khác biệt giữa setDisplayHomeAsUpEnabled và setHomeButtonEnabled là gì?
- 28. sự khác biệt giữa DoCmd.SetWarnings và CurrentDB.Execute là gì
- 29. Sự khác biệt giữa chỉnh lại và sơn lại là gì?
- 30. Sự khác biệt giữa đối tượng khẳng định là gì = null và Assert.assertNotNull (đối tượng)?
Cuộc gọi tốt trên các bài đăng của Mike Ash. – Don
một điều cũng đề cập đến là cơ chế chụp với các khối so với callbacks. –