Tôi đang viết một chương trình tính toán chuyên sâu với VB.NET 2010 và tôi muốn tối ưu hóa tốc độ. Tôi thấy rằng các toán tử AndAlso
và OrElse
chậm một cách bất thường nếu kết quả của phép toán được gán cho một biến cấp lớp. Ví dụ, trong khi các báo cáoAndAlso OrElse có thể chậm bất thường
a = _b AndAlso _c
_a = a
mất khoảng 6 chu kỳ máy giữa chúng trong exe biên soạn, tuyên bố đơn
_a = _b AndAlso _c
mất khoảng 80 chu kỳ máy. Ở đây _a
, _b
và _c
là biến Boolean riêng của Form1
và các câu lệnh được đề cập trong thủ tục mẫu là Form1
, trong đó a
là biến Boolean cục bộ.
Tôi không thể tìm thấy lý do tại sao câu lệnh đơn mất quá nhiều thời gian. Tôi đã khám phá nó bằng cách sử NetReflector xuống mức của mã CIL, mà có vẻ tốt:
Instruction Explanation Stack
00: ldarg.0 Push Me (ref to current inst of Form1) Me
01: ldarg.0 Push Me Me, Me
02: ldfld bool Form1::_b Pop Me, read _b and push it _b, Me
07: brfalse.s 11 Pop _b; if false, branch to 11 Me
09: ldarg.0 (_b true) Push Me Me, Me
0a: ldfld bool Form1::_c (_b true) Pop Me, read _c and push it _c, Me
0f: brtrue.s 14 (_b true) Pop _c; if true, branch to 14 Me
11: ldc.i4.0 (_b, _c not both true) Push result 0 result, Me
12: br.s 15 Jump unconditionally to 15 result, Me
-----
14: ldc.i4.1 (_b, _c both true) Push result 1 result, Me
15: stfld bool Form1::_a Pop result and Me; write result to _a (empty)
1a:
bất cứ ai có thể rụng bất kỳ ánh sáng về lý do tuyên bố _a = _b AndAlso _c
mất 80 chu kỳ máy thay vì dự đoán 5 hay như vậy?
Tôi đang sử dụng Windows XP với .NET 4.0 và Visual Studio Express 2010. Tôi đã đo thời gian với đoạn trích thẳng thắn của riêng mình, về cơ bản sử dụng đối tượng Đồng hồ bấm giờ cho thời gian vòng lặp For-Next với 1000 lần lặp mã trong câu hỏi và so sánh nó với một vòng lặp For-Next trống; nó bao gồm một hướng dẫn vô ích trong cả hai vòng để lãng phí một vài chu kỳ và ngăn chặn việc xử lý ngừng. Thô nhưng đủ tốt cho mục đích của tôi.
Xin lỗi nếu nhận xét này có vẻ như một số, nhưng nếu tôi đang tìm tốc độ tính toán và thời gian đo trong chu kỳ - có thể tôi sẽ không sử dụng VB.NET hoặc .NET nói chung. – TyCobb
có thể nếu bạn đăng thêm mã, chúng tôi có thể đưa ra các đề xuất khác để cải thiện hiệu quả. – Jeremy
Bạn đã thử chỉ sử dụng AND? Đặc biệt là kể từ khi bạn đang làm việc với biến Booleans. –