Ich begann vor ein paar Wochen mit C# zu arbeiten und bin jetzt in einer Situation, in der ich ein "Bit-Set" -Flag erstellen muss, um verschiedene Fälle in einem Algorithmus zu behandeln. Ich habe also zwei Möglichkeiten:Jede signifikante Leistungsverbesserung durch die Verwendung von bitweisen Operatoren anstelle von einfachen int-Summen in 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);
Oder:
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; }
ich etwas als ((eye.X > maxCorner.X) << 1)
verwendet haben könnte, aber C# erlaubt es nicht, implizites Casting von Bool auf int und der ternäre Operator war ähnlich genug. Meine Frage ist nun: Gibt es eine Leistungsverbesserung bei der Verwendung der ersten Version über die zweite?
Danke
Tommaso
Benchmark vor mikro- Durchführung Optimierungen –
Stimmen Sie mit Mitch Wheat überein. Ziehen Sie auch die Lesbarkeit der Leistung vor, es sei denn, Sie können mit einem Profiler einen Engpass nachweisen. – OregonGhost
"Wir sollten kleine Wirkungsgrade vergessen, sagen etwa 97% der Zeit: vorzeitige Optimierung ist die Wurzel allen Übels" Donald Knuth – Cagdas