KIM MINSIK

memoized

LRU 기반 캐싱 라이브러리, 인생 첫 오픈소스 프로젝트

LRU 캐싱을 함수에 붙이기

같은 입력에는 다시 계산하지 않고 이전 결과를 바로 돌려주고 싶었습니다.

Dart와 Flutter에서는 비싼 계산을 UI 생명주기 안에서 반복 호출하기 쉽습니다. 값을 변수에 캐싱해도 되지만 함수 자체를 감싸 "결과를 기억하는 함수"로 만들면 호출부가 단순해집니다.

memoized는 이 캐싱 메니즘을 구현한 Dart package입니다. 무인자 함수는 한 번 계산한 값을 재사용하고 인자가 있는 함수는 최근 호출 결과를 LRU 캐시에 보관합니다.

인생 첫 오픈소스

코드 공개에서 끝나지 않고 pub.dev 배포, README와 changelog 관리, API 사용 예시 문서화까지 처음 경험했습니다.

사용 예제

.memo — 무인자 함수

무인자 함수는 .memo extension으로 감쌉니다. 첫 호출에서만 계산하고 이후에는 저장된 값을 반환합니다.

import 'package:memoized/memoized.dart';

final sum = (() => 1.to(999999999).sum()).memo;

print(sum()); // computes the sum
print(sum()); // returns the cached sum

Memoized1 — 인자가 있는 함수

인자가 있는 함수는 Memoized1, Memoized2 같은 래퍼로 감쌉니다. 재귀 함수에도 붙일 수 있고 같은 인자 호출은 LRU 캐시에서 재사용됩니다.

import 'package:memoized/memoized.dart';

late final Memoized1<int, int> fib;

fib = Memoized1((int n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
});

print(fib(80));