Tôi đã đọc một số bài viết và câu hỏi/câu trả lời kết luận thực hành tốt nhất là để trình biên dịch JIT thực hiện tất cả tối ưu hóa cho các cuộc gọi hàm nội tuyến. Có ý nghĩa.Trình biên dịch JIT có tối ưu hóa các biến khai báo không cần thiết (nội tuyến) không?
Còn các khai báo biến nội tuyến thì sao? Trình biên dịch có tối ưu hóa chúng không?
Nghĩa là, sẽ này:
Dim h = (a + b + c)/2 'Half-Perimeter
If maxEdgeLength/(Math.Sqrt(h * (h - a) * (h - b) * (h - c))/h) <= MaximumTriangleAspectRatio Then
'Do stuff here.
End If
có hiệu suất tốt hơn thế này:
Dim perimeter = a + b + c 'Perimeter
Dim h = perimeter/2 'Half-Perimeter
Dim area = Math.Sqrt(h * (h - a) * (h - b) * (h - c)) 'Heron's forumula.
Dim inradius = area/h
Dim aspectRatio = maxEdgeLength/inradius
If aspectRatio <= MaximumTriangleAspectRatio Then
'Do stuff here.
End If
Tất nhiên tôi thích sau này bởi vì nó dễ dàng hơn để đọc và sửa lỗi, nhưng tôi không thể đủ khả năng sự suy giảm hiệu suất nếu nó tồn tại.
Lưu ý: Tôi đã xác định mã này là nút cổ chai - Không cần phải trả lời về tối ưu hóa sớm. :-)
Bạn không thể trả thêm 20 byte RAM?Điều này rất khó có thể thúc đẩy hiệu suất của ứng dụng của bạn, đặc biệt là nếu mã này được chạy lặp đi lặp lại, nó sẽ là 20 byte giống nhau mỗi lần. –
Trình biên dịch (không phải là JIT!) Sẽ là "chịu trách nhiệm" đối với loại tối ưu hóa này trong khi dịch sang MSIL? (Và nếu như vậy, trình biên dịch MS C# tối ưu hóa ở mức độ nào) Trong mọi trường hợp, nó sẽ là một cách tương đối duy nhất. –
Bạn là người duy nhất ở đây có thể trả lời câu hỏi. Bạn đã viết mã cả hai cách. Chạy cả hai cách, đo thời gian, và sau đó bạn sẽ biết cái nào nhanh hơn. Những gì jitter có hoặc không làm là không thích hợp; biết những gì jitter không có cách nào trả lời câu hỏi "cái nào nhanh hơn?" –