ObjectPool in JS

October 16, 2015

1. 정의

  • 생성된 객체들을 별도의 Pool 안에 저장 후 재사용 하는 방법으로, 불필요한 객체 생성반환(GC에 의한)을 최소화하는 디자인 패턴중 하나 이다.

    • 객체 재사용을 위해, 생성된 객체Pool 안에 저장시켜 놓는다.

    • 새로운 객체가 필요할때는, 무조건 새로 생성하는것이 아니라, Pool 안에 반환객체가 존재한다면, 그 중 하나를 재사용 한다.

      • 객체 재사용으로 Heap 메모리 사용을 최소화한다.
    • 사용(객체)이 끝난 후에는 다시 Pool 안에 반환시킨다.

2. 특징

  • 정해진 범위내에서 개발자가 직접 Heap 메모리를 관리(객체 생성반환)할 수 있다.

    • 객체 생성 비용을 줄일 수 있다.(Heap 메모리 사용을 줄일 수 있다)

      • 당연한 말이겠지만, 생성되는 객체 크기 및 그 에 따라, 더 많은 비용을 줄일 수도 있다.
    • GC 를 통해 일어나는, 메모리 반환(반환 시 일어나는 일련의 작업들)) 비용을 줄일 수 있다.

      • 보통 이 과정(메모리 반환 과정)을 처리하는 동안에는, 프로그램 실행 이 중단된다.

      • 또한, 이 과정은 프로그램 실행 중 임의의 시간에, 임의의 시간동안 언제라도 일어날 수 있다.

      • 개발자는 이 과정제어할 수 없다.

      Static Memory Javascript with Object Pools

  • 재사용되는 객체모두 동일한 타입을 갖는다.

3. JS 로 동적 ObjetPool 구현해보기

  • 일반적인 동적 Objet Pool 기능을 만드는 방법은 위 코드와 같이 크게 어렵지 않다.(물론 지원하는 기능의 범위에 따라, 구현 수준은 크게 달라질 수 있다)

4. ObjectPool 적용 테스트

  • Click 버튼을 10번 누른 후 Profiles(in Chrome Tool) 패널을 통해, Heap Memory 를 체크하면 적용 유/무에 따른 결과를 얻을 수 있다.

    • Object Pool 적용 전

      • Ball 생성자 함수를 통해 객체를 300개 할당했다.

        • 30 * 10 = 300(무조건 새로운 객체를 Heap 메모리에 할당했다)

      ballHeap

    • Object Pool 적용 후

      • $F 생성자 함수를 통해 93개의 객체를 할당했다.

        • $F: Object Pool 라이브러리상에서 만든 생성자 함수.

        • 적용 후에는 총 93개의 객체를 할당했으며, 207개의 객체를 재사용하였다.

      ballHeap2

5. 정리하며

  • 즉 지나친 객체 생성반환최소화 하는것이, 어플리케이션상에 메모리 변동을 줄이는 방법이며, 이로인해 사용자 경험까지 최적화할 수 있다.

  • 일반적인 상에서는 적용할 일이 거의 없어보이지만, 게임 어플리케이션이라면, 적용 범위가 꽤 많을 듯 하다.

6. 참고 URL


Profile picture

Written by mohwa