2021년 8월 2일 월요일

GC Alloc를 줄이자

 GC Alloc를 줄이자


CPU 최적화를 최대한 해주기 위해서 GC Alloc를 최대한 줄일려고 노력을 한 적이 있었다.
그 중에서 GC Alloc를 천 단위로 계속 호출해서 프레임에도 심한 영향을 준 케이스와 백 단위로 계속 호출해서 약한 영향을 준 케이스가 2개 있어서 적어볼려고 한다.

첫번째 심했던 케이스는
-string 끼리 더하는 코드 예시-

-해당 코드 프로파일링 결과-

공부를 하다보면 누구나 한번쯤 들어봤을 string 끼리 더하는 코드였다.
발견 당시에 2년 넘게 개발중인 게임에서 이런 식의 코드가 있었다는게 좀 황당했던 기억이 남아있다.

형태에 따라 stringbuilder를 사용해도 상관없지만 당시에는 구조를 조금 바꿔서 아예 지워버렸던 것으로 기억한다.

의외로 별거 아니라고 생각하는 사람도 있는데 update문이나 자주 사용하는 함수의 for문등에 사용 할때는 문제가 될 수 있으므로 그냥 해당 형태를 최대한 피하는 것이 좋다.

두번째 케이스는 
-AddRange와 FindAll을 반복해서 사용 하는 형태-


-해당 코드 프로파일링 결과-

두번째도 마찬가지로 update문에서 돌아가는 코드였는데 addrange와 findall을 사용하는 형태였다.
사실 개인적으로 저것을 자주 사용하지 않아서 GC Alloc를 유발하는지 모르고 있었는데 프로파일링을 하다보니 알게 되었다.
해당 코드의 수정방법은 다소 무식하게 하면 간단하다.

-2중 For문과 if조건문으로 수정한 코드-

                                           -해당 코드 프로파일링 결과-

좀 코드가 길어지더라도 for문을 한번 더 사용해서 같은 결과만 나오게 해주면 해결된다 그리고 실제 코드에서 리스트 초기화하는 부분도 따로 빠져있지 않았어서 불편해서 수정했다.

회사에서 이렇게 프로파일링을 해서 코드들을 수정하고 나서부터는 이러한 것들이 한번 호출하고 끝나는 코드에서는 별 상관 없지만 습관이 생긴다고 평소에도 의식하면서 코드를 짜게 만들어 주었다.

혹시 이글을 보게 된다면 자신의 게임의 GC Alloc call을 한번쯤 확인해보는 것은 어떨까

댓글 없음:

댓글 쓰기