반응형

C/C++에서 memset()은 종종 최적화에 대한 얘기가 종종 나오는 테마이다.

이론적으로는 내용들에 동감은 하는데, 과연 실제로 영향이 있는지 확인해봤다.


비교 대상은 memset(), 단순무식, 8바이트 정렬 고려한 최적화, 버클리 구현 소스 등.


- memset() : 그냥 Visual C++에 내장된 함수

- 단순무식 : 루프 돌리는, 일반상식에 기반한 코딩

- 8바이트 단위 쓰기 : 루프를 8바이트 단위로 돌리면서 uint64_t 단위로 쓰기 (참조 사이트)

- 8바이트 단위 정렬 최적화 : 메모리에 쓸 때 주소가 8바이트 단위면 CPU가 조금 더 최적화한다는 점을 고려한 쓰기

- 버클리 구현 : 8바이트 단위 정렬 최적화의 버클리 버전 (참조 사이트)


이 코드를 디버그 모드에서 돌렸을 때의 결과는 아래와 같다.


0123


예상대로 단순무식이 가장 성능이 떨어진다.

각종 최적화 방식을 적용한 결과가 꽤 성능이 잘 나오는 편이지만, memset()의 성능에는 못 미친다.

아무래도 memset()는 내장 라이브러리인지라 디버그 모드에서 성능 영향을 조금 덜 받는 게 원인인 듯.

동일한 최적화 방식을 적용했는데, 버클리 소스 쪽이 다소 성능이 낮은 게 특이하다.



그런데, 릴리즈 모드는 예상을 살짝 벗어난다..


0123


단순무식의 성능이 의외로 높은 편이다.

CPU의 8바이트 최적화 개념을 적용한 결과는 오히려 성능이 눈에 띄게 느리다.

버클리 소스는 눈에 띄게 성능이 빨라졌지만, 단순무식보다 다소 느리다.

아마도 이런 결과가 나온 것은 컴파일러 최적화 이슈와 크게 관련이 있는 것 같다.



그런데, 전체적으로 memset()를 능가하는 결과를 보여주는 구현이 없다는 점이 가장 눈에 띈다.

이러한 내용들은 이미 memset() 내부에 모두 구현이 되었다고 봐야 할 듯.


결론 : 그냥 memset() 쓰자. 최적화는 괴수들이 알아서 다 해줌.



반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band