2010-05-17 9 views
7

Tôi bắt đầu làm việc với C# cách đây vài tuần và tôi đang ở trong tình huống mà tôi cần xây dựng cờ "bit set" để xử lý các trường hợp khác nhau trong thuật toán. Tôi có nên hai lựa chọn:Bất kỳ cải tiến hiệu suất đáng kể nào bằng cách sử dụng toán tử bitwise thay vì các số tiền int thuần trong C#?

enum RelativePositioning 
    { 
     LEFT = 0, 
     RIGHT = 1, 
     BOTTOM = 2, 
     TOP = 3, 
     FRONT = 4, 
     BACK = 5 
    } 

    pos = ((eye.X < minCorner.X ? 1 : 0) << (int) RelativePositioning.LEFT) 
     + ((eye.X > maxCorner.X ? 1 : 0) << (int) RelativePositioning.RIGHT) 
     + ((eye.Y < minCorner.Y ? 1 : 0) << (int) RelativePositioning.BOTTOM) 
     + ((eye.Y > maxCorner.Y ? 1 : 0) << (int) RelativePositioning.TOP) 
     + ((eye.Z < minCorner.Z ? 1 : 0) << (int) RelativePositioning.FRONT) 
     + ((eye.Z > maxCorner.Z ? 1 : 0) << (int) RelativePositioning.BACK); 

Hoặc:

enum RelativePositioning 
    { 
     LEFT = 1, 
     RIGHT = 2, 
     BOTTOM = 4, 
     TOP = 8, 
     FRONT = 16, 
     BACK = 32 
    } 

    if (eye.X < minCorner.X) { pos += (int) RelativePositioning.LEFT; } 
    if (eye.X > maxCorner.X) { pos += (int) RelativePositioning.RIGHT; } 
    if (eye.Y < minCorner.Y) { pos += (int) RelativePositioning.BOTTOM; } 
    if (eye.Y > maxCorner.Y) { pos += (int) RelativePositioning.TOP; } 
    if (eye.Z > maxCorner.Z) { pos += (int) RelativePositioning.FRONT; } 
    if (eye.Z < minCorner.Z) { pos += (int) RelativePositioning.BACK; } 

tôi có thể đã sử dụng một cái gì đó như ((eye.X > maxCorner.X) << 1) nhưng C# không cho phép ép kiểu ngầm từ bool để int và các nhà điều hành ternary là đủ tương tự. Câu hỏi của tôi bây giờ là: có cải thiện hiệu suất nào trong việc sử dụng phiên bản đầu tiên trong lần thứ hai không?

Cảm ơn bạn
Tommaso

+8

chuẩn trước khi thực hiện vi tối ưu hóa –

+0

Đồng ý với Mitch Wheat. Cũng thích khả năng đọc hơn hiệu suất, trừ khi bạn có thể chứng minh một nút cổ chai với một hồ sơ. – OregonGhost

+4

"Chúng ta nên quên đi hiệu quả nhỏ, khoảng 97% thời gian: tối ưu hóa sớm là gốc rễ của tất cả các điều ác" Donald Knuth – Cagdas

Trả lời

5

Các inline if điều hành (?, :) sẽ tạo ra gần giống như IL if danh sách tiêu chuẩn trong ví dụ thứ hai. Sự khác biệt duy nhất bạn sẽ thấy ở đây là các hoạt động cụ thể mà bộ xử lý sẽ thực hiện và tôi có thể đặt cược rằng ADD nhanh hơn SHL.
Vì bạn sẽ vẫn đang thêm kết quả, tôi sẽ chọn tham gia ví dụ thứ hai (cộng thêm nó giúp dễ đọc hơn).

EDIT
tôi chỉ kiểm tra IL của cả hai ví dụ, và nó đi ngược lại những gì tôi đã nói ở trên.
Ví dụ đầu tiên tạo ra ít IL hơn (34 dòng ít hơn), do đó bạn sẽ phải chạy thử nghiệm hiệu suất để thực sự xác định xem nó có nhanh hơn không.

+0

+1 để chỉnh sửa. –

0

Đáng kể nhanh hơn? Không. Hơi nhanh hơn? Một chút.

8

Bạn chắc chắn nên sử dụng số Flags attribute cho enum của mình. Bằng cách đó nó sẽ giống như thế:

[Flags] 
public enum RelativePositionings 
{ 
    None = 0, 
    Left = 1, 
    Right = 2, 
    Bottom = 4, 
    Top = 8, 
    Front = 16, 
    Back = 32 
} 

Với điều này bạn có thể làm những việc như vậy như:

var position = RelativePositionings.Left | RelativePositionings.Front; 

và kiểm tra cho mỗi tiểu bang theo:

if(position.HasFlag(RelativePositioning.Left)) 
{ 
    //To do: if left bit is set? 
}