2010-05-17 14 views
7

Birkaç hafta önce C# ile çalışmaya başladım ve şimdi bir algoritmadaki farklı durumları ele almak için bir "bit seti" bayrağı oluşturmam gereken bir durumdayım.Düz int yerine bitly operatörleri kullanarak herhangi bir önemli performans artışı C# toplamı?

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); 

Veya: Ben böylece iki seçenek vardır ((eye.X > maxCorner.X) << 1) olarak

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; } 

ben kullanmış olabilir bir şey ama C# bool gelen örtülü döküm int izin vermez ve üçlü operatör yeterince benzerdi. Şimdi sorum şu: ikinci versiyonun ilk versiyonunu kullanırken herhangi bir performans artışı var mı?

İkinci örnekte, standart if liste olarak hemen hemen aynı IL üretecektir
Tommaso

+8

kriter böyle bir şey olmazdı Bu şekilde Optimisations –

+0

Mitch Buğday ile Katılıyorum. Ayrıca, bir profiler ile bir darboğazlığı kanıtlayamazsanız, performans üzerinde okunabilirliği de tercih edin. – OregonGhost

+4

"Küçük verimlilikleri unutalım, zamanın yaklaşık% 97'sini söyleyelim: Prematüre optimizasyon tüm kötülüklerin köküdür" Donald Knuth – Cagdas

cevap

5

içi if operatör (?, :) ederiz. Burada göreceğiniz tek fark, işlemcinin yapacağı özel işlemlerdir ve ADD'un SHL'dan daha hızlı olduğuna bahse girerim.
Yine de sonuçları ekleyeceğinizden beri, ikinci örneği tercih ederim (artı okumayı çok daha kolay hale getirir).

DÜZENLEME
Sadece her iki örneklerden IL kontrol ve yukarıda söylediklerini aykırı.
İlk örnek çok daha az IL (34 satır daha az) üretir, bu yüzden daha hızlı olup olmadığını gerçekten anlamak için bir performans testi yapmanız gerekir.

+0

+1. –

0

Önemli ölçüde daha hızlı mı? yok hayır. Biraz daha hızlı mı? Birazcık.

8

Enum için kesinlikle Flags attribute'u kullanmalısınız. Eğer gibi böyle şeyler yapabilirsiniz Bununla

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

:

var position = RelativePositionings.Left | RelativePositionings.Front; 

ve her devlet için kontrol edin: mikro- gerçekleştirmeden önce

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