2009-02-24 6 views
6

null 할당과 비교하여 변수 할당이 비쌉니까? 예를 들어 foo가 null을 할당하기 전에 foo가 null이 아닌지 확인해 보는 것이 좋을까요?null에 할당하기 전에 변수가 null인지 확인하십시오.

if (foo != null) { 
    foo = null; 
} 

아니면 아무것도 걱정하지 않습니까?

+0

나는 모든 대답에서 (일관된) 메시지가 중요하다고 생각하기 때문에이 질문을 upvoting하고있다. IMHO, 아래에 인용 된 크 누스는 절대적으로 옳습니다. 그리고 이것이 문제가되는 3 %의 경우에 빠졌음에도 불구하고 단단한 프로파일 링과 벤치마킹 만이 명확한 답을 줄 것입니다. – RBerteig

+0

나는 일관된 답변을 통해 내가 분명히 잘못된 것을 발견했다는 것을 알 수 있습니다 ... – Albert

답변

30

이것은 마이크로 마이크로 최적화 (어쨌든 컴파일러가 처리 할 수있는 기능)입니다. 그것에 대해 걱정하지 마십시오. 실제 알고리즘에 초점을 맞추면 훨씬 더 많은 수익을 얻을 수 있습니다.

조기 최적화는 모든 효율성의 약 97 %를 잊지 말아야합니다. 조기 최적화는 모든 악의 뿌리입니다. - Donald Knuth

+0

차이가 본질적으로 0이되었으므로 어느 것이 더 명확할까요? 수표로 또는없이? – Albert

+0

수표가 없습니다. –

+0

@mike, 당신 말이 맞아요. 하지만, 우리는 여기서 실제적인 질문에서 벗어나지 않고 있습니까? 질문이 더 효율적일 것입니다. 그러나 우리는 작은 일에 너무 많은 시간을 쓰지 말아야하는 방법에 대해 이야기하고 있습니다. 우리가 이야기하고있는 좋은 관행과 질문에 대한 대답이 아닙니다! –

7

실제로 이것은 매우 효율적입니다.보다 작은 입니다. 변수 할당은 null 체크와 대략 동일하며 가능한 추가 분기가 있습니다. 별로 다르지 않다.

아니면 아무것도 걱정하지 않습니까?

가져 왔습니다.

3

걱정하지 않으셔도됩니다. 코드를 추가하면됩니다. 이것은 미세 최적화의 일종으로 lots가없는 경우이 병목 현상임을 증명하는 문서화 된 증거입니다.

1

foo = null; 

if (foo != null) 
    foo = null; 

내가 두 번째 블록 코드를 보면 당신은 단지 그것을 전에 null이 아닌 경우 null로 foo는 변수를 설정하고 싶다고 생각하고, 내가 첫 번째 코드를 보면 내가 생각 어쨌든 변수 foo를 null로 설정하기를 원합니다.

필자가 작성한 예제로 인해 이것이 알지만, 결국에는 이런 종류의 마이크로 최적화가 혼란 만 가중시킬뿐입니다.

+0

어떤 버전이 더 혼란 스럽습니까? – Albert

1

이렇게하면 최적화 된 코드라도 문제가 될만한 가치가 없을 정도로 코드를 읽기가 훨씬 어려워집니다.

최적화가 아닙니다. 대부분의 현대 CPU에서 if 문은 매우 비쌉니다.

+0

어떤 버전이 더 혼란 스럽습니까? – Albert

+0

분명히 두 버전 모두 일부 사용자를 혼란스럽게합니다. –

+0

아, 훌륭합니다;) – Albert

1

이렇게해도 효과는 거의 없거나 전혀 없습니다. 나는 당신이 차이를 증명할 수있는 벤치 마크를 만들 수 있다고 생각하지 않습니다.

A가 (선언의 외부) 보통 입니다 변수에 "널 (null)"을 지정 :

사실, 일부는 전혀 null로 할당하는 코드 냄새합니다 (PMD detector for NullAssignment 참조)임을 주장 나쁜 형태. 경우에 따라 할당은 프로그래머가 코드에서 진행중인 작업을 완전히 이해하지 못했다는 표시입니다. 참고 : 이러한 일종의 할당 은 가끔씩 가비지 수집을 권장하는 데 유용 할 수 있습니다.당신이 에 의해, 모든 수단을 그것을 사용하고 무엇 경우, 일반적으로

:-)이 규칙을 무시, 내가 가비지 수집을 장려하기 위해 시도 아무것도 개인적으로 의심 해요 (당신은 거의 항상 효과를 얻을 수 당신이 기대하지 않았던).

+0

맞습니다. 의미있는 차이가있는 벤치 마크를 만들 수 없습니다. null에 할당하는 것이 나중에 빈약 한 것인지 아닌지에 대해 깊이 생각할 것입니다. 감사! – Albert

2

우선, 마이크로 최적화입니다. 그래서 걱정할 필요가 없습니다.

하지만 질문에 대답하려면 한 줄로 줄여야합니다. (모든 코드가 NULL을 설정하는 것처럼). 그 인

foo = NULL; 

이유는,

비교 할당보다 훨씬 비싼 작업입니다. (비교는 많은 어셈블리 명령어를 비교적 많이 먹는다. 일반적으로, 뺄셈과 0 또는 XOR 비교와 0 비교). 배정은 지시 사항을 적게 사용합니다.

+0

"비교는 과제보다 훨씬 비용이 많이 드는 작업입니다." – user

2

괜찮은 컴파일러를 사용하면 동일한 코드가 생성됩니다. 당신이 진절머리 나는 컴파일러를 가지고 있다면 if을 가진 컴파일러는 더 나쁠 것입니다. 2009 년 하드웨어에 대한 변수 할당은 매우 저렴하고 조건부 분기는 때로는 비쌀 수 있습니다.