Sự khác nhau giữa Invoke và DynamicInvoke trong các đại biểu là gì? Xin vui lòng cho tôi một số ví dụ mã giải thích sự khác biệt giữa hai phương pháp đó.Sự khác biệt giữa Invoke và DynamicInvoke
Trả lời
Khi bạn có một cá thể đại biểu, bạn có thể biết chính xác loại hoặc bạn có thể chỉ biết rằng đó là Delegate
. Nếu bạn biết loại chính xác, bạn có thể sử dụng Invoke
, là rất nhanh - mọi thứ đã được xác thực trước. Ví dụ:
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
Tuy nhiên! Nếu bạn chỉ biết rằng nó là Delegate
, nó phải giải quyết các tham số vv bằng tay - điều này có thể liên quan đến unboxing, vv - rất nhiều sự phản ánh đang diễn ra. Ví dụ:
Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);
Note Tôi đã viết tay dài args
để làm cho nó rõ ràng rằng một object[]
là tham gia. Có rất nhiều chi phí phụ trội ở đây:
- mảng
- chứng thực đối số được truyền là một "phù hợp" đối với thực tế
MethodInfo
- unboxing vv khi cần thiết
- phản ánh-gọi
- thì người gọi cần phải làm điều gì đó để xử lý giá trị trả lại
Về cơ bản, hãy tránh DynamicInvoke
khi nào có thể. Invoke
luôn thích hợp hơn, trừ khi tất cả bạn có là Delegate
và object[]
.
Đối với một so sánh hiệu suất, sau đây trong chế độ phát hành bên ngoài của debugger (một giao diện điều khiển exe) in:
Invoke: 19ms
DynamicInvoke: 3813ms
Code:
Func<int,int> twice = x => x * 2;
const int LOOP = 5000000; // 5M
var watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.Invoke(3);
}
watch.Stop();
Console.WriteLine("Invoke: {0}ms", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.DynamicInvoke(3);
}
watch.Stop();
Console.WriteLine("DynamicInvoke: {0}ms", watch.ElapsedMilliseconds);
- 1. Sự khác biệt giữa Gọi() và BeginInvoke()
- 2. Sự khác biệt giữa $ (...) và `...`
- 3. Sự khác biệt giữa. và #
- 4. Sự khác biệt giữa $ * và $ @
- 5. Sự khác biệt giữa ". +" Và ". +?"
- 6. Sự khác biệt giữa "**/* /" và "** /"?
- 7. Sự khác biệt giữa = và: =
- 8. Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo
- 9. Sự khác biệt giữa Html.RenderAction và Html.Action
- 10. Sự khác biệt giữa cookie và phiên?
- 11. Sự khác biệt giữa '.' và "." trong java
- 12. Sự khác biệt giữa SimpleDB và S3
- 13. C++ - Sự khác biệt giữa (*). và ->?
- 14. Sự khác biệt giữa offsetHeight và clientHeight
- 15. Sự khác biệt giữa RDLC và SSRS
- 16. Sự khác biệt giữa "\ n" và Environment.NewLine
- 17. Sự khác biệt giữa qt và PyQt4
- 18. Sự khác biệt giữa AForge và OpenCV
- 19. Sự khác biệt giữa toFixed() và toPrecision()?
- 20. sự khác biệt giữa cacao và cocoatouch
- 21. Sự khác biệt giữa smtpClient.send() và smtpClient.SendAsync()?
- 22. Sự khác biệt giữa window.location.host và window.location.hostname
- 23. Sự khác biệt giữa DTLS và TLS
- 24. Sự khác biệt giữa Mealy và Moore
- 25. sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket
- 26. Sự khác biệt giữa Arrays.sort() và Arrays.parallelSort()
- 27. sự khác biệt giữa orm và pdo
- 28. Sự khác biệt giữa nproc và ulimit?
- 29. Sự khác biệt giữa apc_add và apc_store?
- 30. Sự khác biệt giữa mb_substr và substr
Liệu nó có nghĩa rằng trong trường hợp sử dụng các DynamicInvoke trình biên dịch tạo ra nhiều mã IL để xử lý yêu cầu ủy nhiệm? – testCoder
@testCoder no, nó sẽ sử dụng sự phản chiếu –
Cảm ơn, lời giải thích rất đầy đủ. – testCoder