code

C에서 변수 사용을 등록하는 좋은 예는 무엇입니까?

starcafe 2023. 8. 1. 20:40
반응형

C에서 변수 사용을 등록하는 좋은 예는 무엇입니까?

저는 K&R을 통해 읽고 있는데, 레지스터 변수에 관한 작은 섹션에 왔는데, 여기 사람들이 이것을 실행에 옮기는 좋은 예를 가지고 있는지 궁금합니다.

K&R의 섹션 4.7부터:

처럼 보입니다.
register intx;
ch 레지스터 ch;

분명히 말씀드리자면, 저는 그저 멋진 코드 샘플을 보기를 바랄 뿐입니다.저는 주제를 이해한다고 확신하기 때문에 자세한 설명을 입력할 필요성을 느끼지 마십시오.

최신 컴파일러를 사용할 때 레지스터 사용에 대한 좋은 예는 없습니다(읽기: 최근 15년 이상, 그리고 이 답변은 2008년부터입니다). 왜냐하면 이것은 거의 전혀 도움이 되지 않고 일부 나쁜 일을 할 수 있기 때문입니다.당신이 레지스터를 사용할 때, 당신은 컴파일러에게 "나는 당신보다 내 코드를 최적화하는 방법을 더 잘 안다"고 말하는 것인데, 이것은 거의 절대 그렇지 않습니다.레지스터를 사용할 때 다음 세 가지 중 하나가 발생할 수 있습니다.

  • 컴파일러가 이를 무시합니다. 가능성이 높습니다.이 경우 유일한 단점은 코드에서 변수의 주소를 가져올 수 없다는 것입니다.
  • 컴파일러는 사용자의 요청을 수락하므로 코드 실행 속도가 느려집니다.
  • 컴파일러는 사용자의 요청을 따르고 코드가 더 빨리 실행됩니다. 이것은 가능성이 가장 낮은 시나리오입니다.

당신이 레지스터를 사용할 때 한 컴파일러가 더 나은 코드를 생성한다고 해도, 다른 컴파일러가 동일한 작업을 수행할 것이라고 믿을 이유가 없습니다.컴파일러가 충분히 최적화되지 않은 중요한 코드가 있는 경우에는 어쨌든 해당 부품에 어셈블리어를 사용하는 것이 최선의 방법이지만 생성된 코드가 실제로 문제인지 확인하기 위해 적절한 프로파일링을 먼저 수행해야 합니다.

일반적으로 저는 로버트의 에 동의하지만, 좋은 규칙으로서 이것도 예외가 있습니다.
심층 임베디드 시스템에서 작업하는 경우 컴파일러보다 특정 하드웨어 아키텍처에서 특정 응용 프로그램에 대한 코드를 최적화하는 방법을 더 잘 알고 있을 수 있습니다.

그러나 99%의 경우 로버츠 설명은 내장된 단어에도 좋습니다.

나는 이것이 꽤 오래 전의 일이라는 것을 알지만, 여기에 레지스터 변수를 사용하면 적어도 코드를 컴파일하기 위해 gcc 4.5.2를 사용하여 알고리즘을 더 빠르게 만드는 hepsort의 하위 절차 구현이 있습니다.

inline  void max_heapify(int *H, int i){
    char OK = FALSE;
    register int l, r, max, hI;
    while(!OK){
        OK = TRUE;
        l = left(i);
        r = right(i);
        max = i;
        if(l <= H[SIZE] && H[l] > H[i]){
            max = l;
        }
        if(r <= H[SIZE] && H[r] > H[max]){
            max = r;
        }
        if(max != i){
            OK = FALSE;
            hI = H[i];
            H[i] = H[max];
            H[max] = hI;
            i = max;
        }
    }
}

속성 앞에 register 키워드를 사용하거나 사용하지 않고 알고리즘을 테스트한 후 노트북에서 버전별로 몇 번씩 50,000,000개의 요소가 있는 임의 배열을 정렬하기 위해 실행했습니다.

레지스터를 사용하면 힙소트 시간이 ~135초에서 ~125초로 단축됩니다.

저는 또한 5,000,000개의 요소만 사용하여 테스트를 수행했지만 더 많은 횟수를 실행했습니다.

레지스터가 없는 버전은 11초에 시작했지만 실행할 때마다 9,65초에 도달할 때까지 시간을 줄이고 중단했습니다.

레지스터가 있는 버전은 10초에서 시작하여 8,80초까지 시간을 낮췄습니다.

캐시 메모리와 관련이 있는 것 같습니다.그럼에도 불구하고 레지스터는 상수 인자에 의해 알고리즘을 더 빠르게 만드는 것처럼 보입니다.

이 변수들은 알고리즘을 따라 상당히 많이 사용되기 때문에 컴파일러에게 이 작업을 맡기는 대신 레지스터에 있는지 확인함으로써 이 경우 더 나은 결과를 얻었습니다.하지만, 그것은 시간을 그렇게 많이 향상시키지는 못했습니다.

아직도 누군가에게 도움이 되길 바랍니다, 인사드립니다.

또 다른 일반적인 경우는 낮은 수준의 인터프리터를 구현하는 경우입니다.레지스터에 가상 시스템 스택 포인터와 같은 일부 상태를 유지하면 메모리 액세스를 크게 줄이고 코드를 빠르게 만들 수 있습니다.

최적화의 예는 효율적인 가상 시스템 인터프리터 생성기인 vmgen을 참조하십시오(스택 캐싱의 맨 위 5.2).

첫째, 레지스터 변수는 루프 제어 변수와 같이 많이 사용되는 변수에 사용되어 접근 시간을 최소화하여 성능을 향상시켜야 합니다.secondary, fun (autoint a, auto int b)와 같은 상황에서는 오직 스토리지 지정자만 사용할 수 있고 등록할 수 있습니다. :error fun (register int a, register int b) :right only 이것만 실행됩니다. (static inta, static int b) :error fun (extern int b)

이것은 여러 코딩의 맥락이 있기 때문에 여러 가지 대답이 필요한 질문입니다. 상위 언어 관점에서 C 언어가 어셈블리 루틴을 호출할 수 있기 때문에 중간 수준과 하위 수준(어셈블리까지)입니다.

C 대신 어셈블리를 사용하는 이유는 개발 중에 발생한 성능 문제로 인해 register 키워드가 필요하지만 개발자의 의도대로 작동하지 않는 경우가 많습니다.

언급URL : https://stackoverflow.com/questions/314994/whats-a-good-example-of-register-variable-usage-in-c

반응형