몇 주 전에 C#으로 작업하기 시작했습니다. 알고리즘의 다른 케이스를 처리하기 위해 "비트 세트"플래그를 만들어야하는 상황에 처했습니다.C#에서 일반 int sum 대신 비트 연산자를 사용하면 성능이 크게 향상됩니까?
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);
또는 : 나는 이렇게 두 가지 옵션이 ((eye.X > maxCorner.X) << 1)
로
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; }
내가 사용했을 수있는 일을하지만, C#을 부울에서 암시 적 캐스팅이 int로 허용하지 않고 삼항 연산자가 충분히 유사했다. 내 질문은 지금 : 두 번째 이상의 첫 번째 버전을 사용하여 성능 향상이 있습니까?
번째 예에서 표준if
목록과 거의 동일한 IL을 생성하면
마소
벤치 마크는 그런 일을 보일 것이다 그런 식으로 최적화 –
미치 밀 (Mitch Wheat)과 동의하십시오. 또한 프로파일 러에서 병목 현상을 입증 할 수 없다면 성능보다 가독성을 선호하십시오. – OregonGhost
"시간의 약 97 %를 차지하는 작은 효율성을 잊어 버려야합니다. 즉각적인 최적화는 모든 악의 뿌리입니다."Donald Knuth – Cagdas