C for문 안에서 변수를 선언하면 register 변수로 동작할까요?
글쓴이: high385 / 작성시간: 일, 2016/10/09 - 12:20오후
int totalsum = 0; For (int i=0;i <5;i++){ register int sum = 0; { sum += i×2+2; } { sum +=i×3+4; } totalsum += sum; }
위와 같이 sum을 for문 안에 선언하는 경우와 totalsum처럼
for문 밖에 선언하는 경우의 속도 성능차가 존재할까요?
미미한 성능 차이일까요?
캐시안에 존재하게하려면 for문안에 변수를 선언하라고 하던데
변수가 매 for문마다 새롭게 sum을 생성하는데 캐시안에 load하는데
시간이 걸리진않을까요?
그리고 for문안의 {}가 많을수록 캐시에 새롭게 변수가 업데이트되어야하니까
속도 성능이 나빠질까요?
그렇다면 for문안의 {}대신 함수호출로 대신한다면 더 좋을까요?
나쁠까요?
Forums:
1) 위와 같이 sum을 for문 안에 선언하는
1) 위와 같이 sum을 for문 안에 선언하는 경우와 totalsum처럼
for문 밖에 선언하는 경우의 속도 성능차가 존재할까요?
==> 성능차가 있을 수 있습니다. 그것은 -O1, -O2, -O3 중 어떤 최적화 수준으로 컴파일 했느냐에 따라서 달라질 겁니다.
2) 미미한 성능 차이일까요?
==> 네. 매우 미미한 차이입니다. 이 함수나 루프가 초당 수만번 불리고, 엄청나게 느린 프로세서가 들어가는 임베디드 환경이 아니라면 전혀 신경쓸 필요없습니다.
3) 캐시안에 존재하게하려면 for문안에 변수를 선언하라고 하던데
변수가 매 for문마다 새롭게 sum을 생성하는데 캐시안에 load하는데
시간이 걸리진않을까요?
==> 루프 내부에 변수를 선언하는 것은 꼭 루프가 새 턴(new turn)이 시작될 때마다 그 변수가 생성된다는 의미가 아닙니다. 그냥 scope의 의미로 봐야 합니다. 컴파일러가 다 알아서 굳이 새로 만들이 않아도 되도록 해 줍니다. 그리고 요새 CPU는 캐쉬가 엄청 옛날과 비교해서 넘사벽으로 커졌습니다. 이 간단한 루프에서 처리되는 변수가 캐쉬라인에 안들어 갈리가 없습니다.
4) 그리고 for문안의 {}가 많을수록 캐시에 새롭게 변수가 업데이트되어야하니까
속도 성능이 나빠질까요?
그렇다면 for문안의 {}대신 함수호출로 대신한다면 더 좋을까요?
나쁠까요?
==> 루프내에 얼마나 {}가 있던지 실행에는 전혀 영향이 없습니다. 함수 호출은 기본으로 많은 CPU 사이클을 잡아 먹기 때문에 속도가 중요한 경우에는 가급적 함수 호출을 줄여야 합니다. 그래서 최적화를 위해 함수 호출을 inline 으로 바꾸는 방법이 사용될 정도입니다.
클럭이 수~수십 MHz에 불과하고 캐쉬도 엄청 작고, 크로스 컴파일러 버전도 더이상 업데이트 되지 않는 임베디드 환경이 아니라면 (적어도 최신 PC 기반 동작 환경이라면) 가급적 readable 하고 정확하게 주석이 달린 코드를 작성하는 것이 훨씬 도움이 되는 일입니다.
댓글 달기