2015-02-04 2 views
8

내 주요 질문은 int 및 int8_t 실행 시간에 차이가 있습니까?int 대 int8_t를 사용하여 성능 차이가 있습니까

내가 작업하고있는 프레임 워크에서 일부 매개 변수가 int8_t으로 설정되어있는 코드를 자주 읽습니다. "특정 매개 변수가 -126,125 범위 밖에있을 수 없기 때문에"코드에서 종종 읽습니다.

많은 경우에 통신 프로토콜로는 int8_t이 사용되고 많은 필드로 패킷을 잘라 __attribute((packed)) struct으로 사용합니다.

그러나 어느 시점에서는 주로 데이터 크기에보다 근접한 형식을 사용하는 것이 더 좋을 것이라고 생각했기 때문에 어느 시점에서 컴파일러를 미리 생각해 보았습니다.

코드가 Linux에서 실행되도록 만들어졌으며 glibc를 사용하여 gcc로 컴파일되고 메모리 또는 이식성이 문제가되지 않는다면 성능면에서 실제로 좋은 아이디어인지 궁금합니다.

제 첫 인상은 "어디에서 어떻게 최적화해야하는지 알지 못한다면"컴파일러보다 더 똑똑해 지려고 노력하는 것은 항상 나쁜 생각입니다.

그러나 int8_t을 실제로 사용하는 것이 성능에 대한 비용인지는 모르겠지만 (더 많은 테스트와 계산은 int8_t 크기와 일치해야합니다. 변수가 범위를 벗어나지 않도록하려면 더 많은 작업이 필요합니다.) 또는 어떤 방법 으로든 성능을 향상시키는 경우

간단한 asm을 읽는 것이 좋지 않으므로 테스트 코드를 컴파일하여 asm에 어떤 코드가 더 좋은지 알아 내려고하지 않았습니다.

관련 질문을 찾으려고했으나 과 int에서 발견 된 모든 토론은 성능보다는 이식성에 관한 것입니다.

입력 해 주셔서 감사합니다. 이 문제에 대해 설명 된 어셈블리 샘플 또는 소스는 크게 감사하겠습니다.

+2

운영 체제, 컴파일러, 최적화, ABI 및 대상 프로세서에 따라 다릅니다. –

+0

데비안에서는 gcc, -O2에서는 -std = c99, 32 비트 i686 프로세서. 나는 그것이 약간 명확 해 지길 바란다. – DainDwarf

+3

성능을 찾고있는 경우 #가 width로 대체 된 typedef int_fast # _t는 너비가 최소 # 비트 인 가장 빠른 부호있는 정수 유형을 지정합니다. –

답변

7

int은 일반적으로 CPU의 레지스터 크기와 같습니다. C 표준은 연산자를 사용하기 전에 더 작은 유형을 int으로 변환해야한다고 말합니다.

이러한 전환 (광고 확장)은 비용이 많이 듭니다. 당신이 속도를해야하는 경우

int8_t a=1, b=2, c=3; 
... 
a = b + c; // This will translate to: a = (int8_t)((int)b + (int)c); 

, intint_fast8_t (심지어 안전) 안전 내기, 또는 사용합니다. 정확한 크기가 중요한 경우 int8_t (사용 가능한 경우)을 사용합니다. 당신이 코드의 성능에 대해 이야기 할 때

+0

이러한 변환은 실행 시간보다는 컴파일 시간에 추가 될 것이라고 생각했습니다. – DainDwarf

+0

@DainDwarf 런타임에 어떤 값 변수가 있는지 알 수 없으므로 런타임에 변환을 수행해야합니다 (상수 표현식 제외). – user694733

+2

또한, 그 당시 최신의 인텔 CPU (내가 정확하게 기억한다면 초기 386)의 매뉴얼이 바이트 피연산자를 받아들이는 많은 명령어가 실행하는데 1 클럭주기가 더 걸릴 것이라고 분명하게 명시된시기가있었습니다 dword 피연산자를 다루는 동등한 명령보다 –

0

이 영향을 계정에 당신이 취할 필요 몇 가지가 있습니다 : 데이터 유형은 기본적으로 CPU를 지원합니까 점에

  • CPU 아키텍처, 더는 (그것을 않습니다 8 비트 연산 지원? 16 비트? 32 비트? 등 ...), 잘 알려진 컴파일러로 작업하는만큼
  • 컴파일러하지 않습니다, 당신은 그것을 잘 알고 있어야 :이 항상 고려된다 : 그들은 방법 당신은 당신의 코드는
  • 데이터 유형 및 컴파일러 내장 함수 생성하는 코드에 영향을 쓰기 컴파일러는 코드를 생성 할 때 올바른 데이터 유형 (서명 된 사안과 서명되지 않은 사안)을 사용하여 극적인 성능 영향을 미칠 수 있습니다.

    "컴파일러보다 더 똑똑해 지려고하는 것은 항상 나쁜 생각입니다."- 사실은 그렇지 않습니다. 컴파일러는 일반적인 경우를 최적화하기 위해 작성되었으며 특별한 경우에 관심이 있습니다. 항상 컴파일러보다 더 똑똑해 지도록하는 것이 좋습니다.

귀하의 질문은 "나에게"(즉, 더 나은 성과가 좋은) 답변을 제공하는 데 광범위합니다. 확실하게 알 수있는 유일한 방법은 생성 된 어셈블리 코드를 확인하는 것입니다. 적어도 두 경우 모두 코드를 실행하는 데 필요한 사이클 수를 계산하십시오. 그러나 컴파일러를 돕는 방법을 이해하려면 코드를 이해해야합니다.