Tôi thấy một số câu hỏi liên quan đến việc tối ưu hóa cuộc gọi đuôi bị thiếu trong C# được cho là làm cho ngôn ngữ không phù hợp với việc triển khai thuật toán đệ quy. tuy nhiên, điều này đặt ra câu hỏi, làm thế nào chúng ta có thể thực hiện tối ưu hóa cuộc gọi đuôi và vẫn cung cấp dấu vết ngăn xếp hợp lý khi ngoại lệ được nâng lên hoặc khi sự phản chiếu có thể được sử dụng để kiểm tra ngăn xếp cuộc gọi và hành động theo nó.Làm thế nào để tối ưu hóa đệ quy C# có thể được trả lại khi một ngoại lệ được nâng lên
5
A
Trả lời
5
Vâng, nó chỉ vấn đề nếu bạn mong đợi để có được một stack trace chính xác :)
Tail gọi tối ưu hóa không phải là điều duy nhất có thể phá hủy một stack trace - ví dụ đơn giản nhất là nội tuyến, mà có thể chắc chắn ảnh hưởng đến mọi thứ. Về cơ bản, bất cứ thứ gì dựa vào dấu vết ngăn xếp chính xác đều có một chút rủi ro.
Dưới đây là một ví dụ rất đơn giản chính xác vấn đề rằng:
using System;
using System.Runtime.CompilerServices;
class Program
{
static void Main(string[] args)
{
try
{
Call1();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}
static void Call1()
{
Call2();
}
static void Call2()
{
Call3();
}
[MethodImpl(MethodImplOptions.NoInlining)]
static void Call3()
{
Call4();
}
static void Call4()
{
Call5();
}
static void Call5()
{
throw new Exception();
}
}
xây dựng và chạy mà không cần trình gỡ lỗi, và bạn có thể có được điều này:
at Program.Call3()
at Program.Main(String[] args)
Về cơ bản, hãy cẩn thận những gì bạn làm với chồng dấu vết.
Các vấn đề liên quan
- 1. Làm thế nào để tìm ngoại lệ có thể được nâng lên cho một mô-đun cụ thể trong Python?
- 2. Tối ưu hóa CTE cho các truy vấn đệ quy
- 3. Tối ưu hóa danh sách đệ quy Haskell
- 4. Có thể constexpr chức năng đánh giá làm đuôi đệ quy tối ưu hóa
- 5. Điều gì có thể làm cho mã F # không được tối ưu hóa nhanh hơn mã được tối ưu hóa?
- 6. Chức năng foldl được viết lại của tôi có được tối ưu hóa không?
- 7. Mã này có thể được tối ưu hóa không?
- 8. Làm thế nào để đối phó với không biết những gì ngoại lệ có thể được nâng lên bởi một phương pháp thư viện trong Ruby?
- 9. Có bất kỳ đuôi đuôi động cơ Javascript nào được tối ưu hóa không?
- 10. Làm cách nào để ngăn trình tối ưu hóa Require.js đưa plugin văn bản vào tệp được tối ưu hóa?
- 11. Làm cách nào để chuyển một biến sang một ngoại lệ khi được nâng lên và truy xuất nó khi ngoại trừ?
- 12. gì trường hợp ngoại lệ có thể được nâng lên bởi hành động bưu phẩm
- 13. C#: Xử lý ngoại lệ trong cuộc gọi đệ quy
- 14. Tôi có thể xây dựng một cuộc gọi đuôi được gọi là biểu thức tối ưu đệ quy không?
- 15. BigDecimal quy mô tối ưu để mã hóa
- 16. Làm thế nào để có được một mô tả lỗi std :: ngoại lệ khi gọi một C++ dll từ C#
- 17. làm thế nào tôi có thể nắm bắt gốc của một ngoại lệ stackoverflow trên mã đệ quy
- 18. tối ưu hóa bởi trình biên dịch trong một chương trình đệ quy
- 19. in dấu vết ngăn xếp python mà không có ngoại lệ được nâng lên
- 20. UnknownTimezoneError Ngoại lệ được nâng lên với ứng dụng Python được biên dịch bằng Py2Exe
- 21. làm cách nào tôi có thể làm cho mã này được tối ưu hóa hơn
- 22. C#, tối ưu hóa lạ
- 23. Scala có hỗ trợ tối ưu đệ quy đuôi không?
- 24. Đặt mã thoát trong Python khi ngoại lệ được nâng lên
- 25. Làm thế nào để ngăn chặn g ++ tối ưu hóa ra một vòng lặp được kiểm soát bởi một biến có thể được thay đổi bởi một IRQ?
- 26. Tối ưu hóa ViewState
- 27. Chú thích Scala để đảm bảo chức năng đệ quy đuôi được tối ưu hóa là gì?
- 28. cách xem mã được tối ưu hóa trong c
- 29. LLVM insertvalue được tối ưu hóa kém?
- 30. Trả lại sau khi ném ngoại lệ
các thông báo lỗi chắc chắn mà tôi xử lý hàng ngày từ người dùng có dấu vết ngăn xếp chính xác mặc dù bất kỳ trình tối ưu hóa trình biên dịch nào. Tôi không chắc chắn sẽ hoàn thành nhiều việc :-) –
@Carlo: Đó có thể là do dấu vết ngăn xếp của người dùng nằm trong đường dẫn không bao gồm nội tuyến hoặc tối ưu hóa cuộc gọi đuôi. Ngoài ra, tôi mạnh mẽ nghi ngờ rằng nếu bạn nhìn thực sự cẩn thận, đôi khi bạn sẽ thấy dấu vết ngăn xếp * không * chính xác trong mọi khung hình - nhưng chỉ chính xác trong các khung mà bạn quan tâm. –