2011-02-24 1 views
3

오래전 나는 데이터를 저장하기 위해 항상 가능한 가장 작은 유형을 사용해야한다는 것을 읽었지 만, 읽은 거의 모든 코드는 이것을하지 않습니다. 그들은 종종 32 비트 정수를 사용합니다.가능한 가장 작은 유형을 사용해야합니까?

32 비트 값이 8 비트 값만큼 빠르게 반입된다는 이론을 들었지만 프로세서는 한 번에 여러 개의 작은 값을 반올림하는 몇 가지 방법이 있습니다. 맞습니까?

4 정수 대신 4 바이트를 사용하는 경우 컴파일러가이를 최적화하여 4 바이트가 단일 32 비트 레지스터에 저장/저장되지 않아야합니까?

또는이 모든 것이 실제로 조기 최적화이며 잠재적 인 성능 향상은 무시할만한 수준입니까?

+2

조기 최적화가 정확합니다! –

+1

필자는 다음과 같이 말하고 싶습니다. 많은 공간 (예 : 10 억 개의 요소 할당)을 사용하면 가장 작은 유형을 사용하고, 그렇지 않은 경우에는 컴파일러가 성능을 최적화합니다. – schnaader

답변

4

조숙 한 최적화! 그러나 일단 최적화하면 아키텍처에 따라 달라집니다. 예를 들어, ARM에서 메모리 액세스는 32 비트 정렬되어야합니다 (일부 명령어는이를 수행 할 수 있지만 32 비트 액세스를 수행 한 다음 마스크/시프트를 수행합니다). 바이트를 사용하면 컴파일러는 각 '바이트'에 실제 RAM 4 바이트를 제공하여 더 빠르게 액세스 할 수 있습니다 (처리 할 특수 코드가없는 정렬되지 않은 바이트에 액세스하려고하면 CPU가 괴롭히지 않습니다). D

3

상황에 따라 다르다 : 그것은 CPU의 적절한 사이즈이기 때문에 모든 것을 'INT'를 사용하지만, 기본적으로, 당신이 필요로하는 크기의 종류를 사용하고, 최적화에 대한 컴파일러 걱정하자에 대한 인수가 있습니다

. 작은 캐시가있는 작은 프로세서에서 실행하는 경우 가장 작은 데이터 크기를 선택하는 것이 좋습니다. 많은 양의 데이터가있는 경우 (예 : 각각 8 비트 정밀도가 필요한 수백만 개의 샘플) 가장 작은 데이터 크기를 사용하는 것이 좋습니다. 대부분의 다른 경우 컴파일러에 맡깁니다.

1

32 비트 CPU에서 4 개의 8 비트 바이트를 32 비트 워드로 패킹하면 메모리 액세스 시간이 향상 될 수 있습니다. 이는 4 바이트를 한꺼번에 가져올 수 있기 때문입니다. 그러나 이제는 단일 바이트를 조작하기 위해 CPU가 추가로 시프트하는 & 마스크 등을 수행해야합니다. 따라서 4 바이트를 워드로 패딩하거나 각 바이트를 풀면 (각 8 비트 바이트에 32 비트 사용) 프로와 죄수.

등 최적화 컴파일러는 일반적으로 당신을 위해 올바른 결정을 내릴 것 ++ 우리가 C 또는 C에 대해 얘기하고 가정,하지만 당신은 구조체에 자신의 포장을함으로써해야하는 경우 명시 적으로이 동작을 제어 할 수 있습니다 그러나 데이터의 도메인과 일치하는 유형, 즉 선명도, 유지 관리 가능성 등을 사용하는 더 좋은 이유가 있습니다. 이러한 트럼프 최적화는 시간의 99 %를 차지합니다.