속도

2009-04-05 8 views
2

안녕하세요 내가 (속도 및/또는 효율성의 문제에) 작성하는 더 나은 무엇인지 생각 : 또는속도

bool Method(...) { ... } 

... 

bool result = Method(...); 

if (result == false) 
{ ... } 
// or 

if (!result) 
{ ... } 

또는 ...

if (result == true) 
// or 

if (result) 

처음으로 (result == false)를 사용하기 때문에 물어 보는 것이지만 때로는 매우 길어집니다. 특히 condition ? expr : expr 문에서.

+0

문제에 밀접한,하지만 난 그것을 사용하는 경우 나, 다른 방법으로 라운드를 작성하지, 즉 (거짓 == 결과) (NO 우발적 쓰기). – dirkgently

+0

또한 가독성이 떨어집니다. – Noldorin

답변

1

나는 어떤 차이점이 있다고 생각하지 않으며, 만약 있다면 당신이 그것을 측정하는 데 어려움을 겪을 것입니다. 어떤 차이라도 측정 소음에있을 수 있습니다.

9

개인적으로는 result == false과 같은 것을 볼 때마다 나는 싫증이 난다. 제 생각에는 평등 운영자를 오히려 심하게 오용 한 것이며 완전히 불필요합니다. 컴파일러가이 두 표현식을 같은 바이트 코드로 바꾸어야한다고 생각하지만, 확실히 !result을 사용하고 싶습니다. 사실 더 직접적이고 논리적 인 표현 일뿐만 아니라 언급 한 바와 같이 코드를 더 짧고 읽기 쉬운 것으로 만듭니다. 나는 대다수의 C# 코더가이 점에 관해 나에게 동의 할 것이라고 생각한다.

+0

글쎄, if (result == false)라고 쓰는 이유는 주로 if (! result)보다 읽기가 쉽지 않기 때문이다. 그것은 바로 내가 비교 대상을 즉각적으로 보았 기 때문입니다. –

+1

나는 당신이오고있는 곳을 볼 수있다. (몇 년 전에 나는 똑같이하기를 좋아했다.) 사실, 이것은 boolean과 if 문이 어떻게 작동하는지에 대한 오해로부터 유래했다. ! 결과를 사용하기 시작하면 매우 빨리 익숙해집니다. * 곧 * 더 * 명백하게 보일 것입니다! – Noldorin

+0

예, 전 VB6 개발자였습니다 (약 3 년). 그리고 방금 C# (VB보다 훨씬 나은 구문)에 맞춰졌습니다. 지금, 때로는 VB에서 시작한 것을 후회하고 VB에서 많은 영향을 받았을 때 (항상 엄격하게 변수를 선언했지만) "적절한"개발자가 될 수 없다고 생각합니다. –

4

런타임 속도는 동일합니다. 두 스 니펫이 동일한 MSIL 코드 표현으로 컴파일됩니다.

(!result) 대신 (result == false)을 사용하면 다소 실망 스럽습니다.

2

런타임 코드에는 성능 차이가 없습니다. 내가 일한 회사의 대부분의 코딩 지침은 선호! 결과.

1

반드시!와 함께 표현식을 사용해야합니다. 연산자가 아니라 더 빠르지 만 더 안전하기 때문입니다. 실수 하나를 사용하는 대신 두의 서명과 같다면

, 당신은 값을 비교하는 변수에 값을 대신 지정 : 컴파일러는이 잡을 수있는 다른 데이터 유형에 대한

if (result = false) { 

, (id = 42) 같은 표현으로 는 정수 값을 가지므로 if 문에서 사용할 수 없지만 (result = false)과 같은 표현식은 부울 값을 가지므로 컴파일러가이를 받아 들여야합니다.

(옛 C의 트릭은 할당하지 않을 수 있도록 문자를 먼저 넣어하지만! 운영자가 더 나은 대안 그래서 그 덜 읽을 수 있습니다.)

+0

(result = false)가 C#에서 컴파일되지 않습니다. 그래서 C#에서 실수로 작성할 수 없습니다. –

+0

@Jakob Christensen : 괜찮습니다. 경고 만받습니다. – Guffa

+0

네 말이 맞아. 무서운 :-) –

1

내가 @Noldorin에 동의하지만 if(!result)이 선호됩니다. 데이터 액세스 시나리오에서 자주 발생하는 nullable bool을 테스트해야하는 경우 if(result == false) 및 그 ilk가 매우 유용하다는 것을 알았습니다.

편집 : 다음은 nullable bool에서 항등 연산자를 사용할 수있는 여러 가지 방법을 설명하는 샘플 프로그램입니다.

1

이 과정에는 3 단계가 있다고 생각합니다. 첫째, if 내부에 항상 비교가 있어야한다고 생각하기 때문에 if (this.isMonkey == true) 바나나를 작성합니다.먹다();

또는 더 현실적으로

if(SpeciesSupervisor.getInstance().findsSimilarTo(Monkey.class, 2) == true) { 
    String f = new PropertyBundle("bananarepo").getField("banana store"); 
    EntitiyManager.find(Banana.class,f).getBananas().get(1).eat(); 
} 

그런 다음, 당신은 (this.isMonkey) 물어 괜찮 것을 배우고이 형식이이 경우이 예 ("의 문장으로 더 나은 읽기를 허용 원숭이").

마지막으로, 당신은 나이가 들기 때문에 (b)가 매우 읽기 쉽지 않다는 것과, (b == true)가 가난한 두뇌에게 여기에서 무슨 일이 일어나는지, 그리고이 모든 거친 주장 "오용", "학대", 야다 야다 등은 모두 조금 과장되어 있습니다.

그리고 성능. Java에서는 차이점을 파헤 치지 않습니다. 나는 .NET이 훨씬 더 나쁘다고 생각하지 않는다. 이것은 컴파일러가 할 수있는 가장 쉬운 최적화입니다. 성능이 같다고 돈을 벌 것입니다.

건배,

니코