인디게임갤에서 땡겨옴
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
https://github.com/dotnet/BenchmarkDotNet
유니티 딥 프로파일링은 좋다.
근데 특정 함수가 무겁다! 라고 하는 걸 알아냈다 하더라도
해당 함수만 죽어라 돌려서 실제 부하를 측정해낼 필요는 여전히 있음.
그럴 때 이런 걸 써보면 어떨까?
(본격 약팔이 멘트)
(싱글벙글 웃는 달팽이가 나를 보는 것 같다. 열심히 달려봤자 느려터진 불쌍한 달팽이...)
BenchmarkDotNet은 모든 런타임에서 벤치 마크를 자동으로 실행하고 측정을 집계하며 가장 중요한 정보가있는 요약 테이블을 인쇄합니다.
측정 된 데이터는 플롯(?)을 포함하여 다른 형식 (md, html, csv, xml, json 등)으로 내보낼 수 있습니다.
와 시발 존나 좃문가 행세하게 좋게 생겼다 그치?
근데 우리에게 필요한 건 그냥 ms 랑 메모리GC숫자 두개면 된다. 이딴건 패스하자.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
사용법
누겟 가면 있음. 설치하고 싶은 프로젝트에 꽂자.
단 다른 것들 (이 누겟이 필요로 하는게 좀 많음)이 엄청 깔리니까, 가급적 별도의 프로젝트 하나 파서 꽂는게 좋겠지?
(굵고 튼튼한 누겟이 꽂혀버렷...!)
난 프로젝트 하나 파서 설치함 (프로젝트 추가는 솔루션 우클릭 > 프로젝트 추가 하면 됨)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
사용법
1. 측정할 코드를 짠다
2. 해당 프로젝트를 릴리즈 빌드로 뽑아내서 exe로 만든다.
3. cmd로 해당 exe를 실행한다.
차근차근 그림으로 보자!
측정할 함수 2개와, 메인을 가진 코드를 짠다.
빌-드 한다. 솔루션 전체 빌드할 필요 없음에 주의.
단 반드시 릴리즈 모드여야 함. 디버그 모으면 벤치마크 닷넷이 빼애액 에러 냄.
빌드했으니 EXE 파일이 생겼겠지? (경로에 주의)
윈도 CMD 켜고, 경로로 가서 exe 파일 이름 쳐서 실행하자
(난 CMD가 제일 어렵더라. 일일이 치기 싫으면 exe 파일 드래그 해서 CMD에 떨어뜨려도 됨)
그럼 이렇게 측정 결과가 나온다.
곱셈이 나눗셈보다 느리다고 나왔는데 (ㄷㄷㄷ?)
이건 객체 하나 생성하는 코드 (메모리 보려고 넣었음) 때문일 수도 있음. 여튼 된다는 걸 확인했음.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
실전편
자 그럼 말도 많고 탈도 많은 클래스 VS 구조체 GC 대결이다!
벡터2를 자작했는데, 하나는 클래스 하나는 구조체로 만들었다.
이걸 1만개 생성해보는 간단한 코드임.
결과는 이렇게 나옴.
클래스 겁나게 느리고 메모리도 오지게 많이 먹는데 (여기 먹은 메모리가 곧 GC 될 것들 임)
구조체는 쌩쌩 날아다니고 메모리도 추가로 먹지 않았다는 것을 볼 수 있다.
(또 이거보고 힙과 스택도 모르냐 태글 걸 거 같은데, 그냥 예시를 든 것임)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
결론 : 세상에 좋은 거 많으니 고민하지 말고 측정하자.
근데 유니티 프로파일러만 잘 봐도 웬만한건 다 해결됨 ㅋ
이딴거 측정하고 있으면 세월 잘 가서 니 프로젝트 3년 됨.
따봉