프로젝트 아키텍처 구조 중에 룸들이 있는데 클라이언트가 요청할 때마다 이 룸들의 정보를 반환해주는게 있다.
그런데 요청할 때마다 새롭게 정보를 최신화 해주는것은 성능적으로 문제가 있다고 판단했다.
그래서 아래와 같이 성능을 최적화 시키고자 했다.
- SizedByteArray를 통해 룸들의 정보를 바이트 배열화 시킨다.
- 룸들이 추가되거나 삭제될 때마다 bool dirty 값을 true로 바꿔준다.
- 클라이언트가 요청할 때마다 dirty값을 보고 바이트 배열을 최신화 한뒤 false로 바꿔주고 바이트 배열을 반환한다.
이렇게 한다면 매번 클라이언트가 룸 정보를 요청할 때마다 룸 정보를 만들어서 할 필요가 없이
룸정보가 바뀌더라도 바로 최신화 하지 않고 룸 정보가 바뀌었으며 클라이언트가 요청할 때 최신화가 안되었으면 최신화를 하는 방식이기에 성능을 비약적으로 최적화시킬 수가 있다.
그런데 주의점이라하면 SizedByteArray는 과연 안전한 배열일까?
Byte[] 를 반환하는데 이 배열값을 FlatBufferBuilder 내부에서 관리하는 것이라면 FlatBufferBuilder가 GC에 의해 삭제되면 나중에 메모리 오염 문제가 생기지 않을까? 하는 의문점이 생긴다.
그래서 직접 FlatBufferBuilder 클래스의 SizedByteArray를 타고타고 들어가 보았다.
총 3번에 걸쳐서 함수가 완성되는 구조였다.
마지막 ToArray<T>를 호출할 때 T를 byte로 호출한다.
그리고 ToArray함수 내부에는 new로 배열을 새로 할당한 뒤 BlockCopy로 딥카피를 해준다.
따라서 반환되는 바이트 배열은 FlatBufferBuilder가 가지고 있는 배열과는 완전히 다른 배열인것이다!
그렇기에 해당 최적화 로직을 적용시킬 수 있었다.
'C#' 카테고리의 다른 글
[C#] 구조체는 new를 써도 스택에 할당될까? (4) | 2025.07.07 |
---|---|
[C#] 구글 프로토 버퍼 .proto 문법 정리 (0) | 2024.04.23 |
[C#] Extension Method (0) | 2023.12.12 |
[C#] Task 와 Thread의 차이점 (0) | 2023.10.26 |