함수 끝에서 큰 데이터 구조를 drop(해제)하는 데 시간이 많이 걸려 응답이 늦어질 때, 값을 다른 스레드로 옮겨 drop을 지연시키는 간단한 우회 방법을 소개한다.
URL: https://abrams.cc/rust-dropping-things-in-another-thread

Rust 애플리케이션이나 CLI를 만들 때, 최종 사용자에게 가능한 한 빨리 무언가를 보여줘야 하는 경우가 종종 있다. 이런 작업을 하다 보면, 보통 시간의 상당 부분이 계산을 하는 데가 아니라 함수 끝에서 큰 데이터 구조를 drop(해제)하는 데 쓰이는 경우가 많다.
예를 들어, 어떤 함수가 무거운 객체를 받아서 그 크기를 반환한다고 상상해 보자:
a의 size를 얻는 것은 극히 저렴하다. 약 0.01ms 정도 걸린다. 하지만 함수 전체는 실제로 어떤 값도 반환하기까지 1000ms가 걸릴 수 있다. Rust는 반환하기 전에 a의 값을 drop하고, 그 값이 사용하던 모든 메모리를 해제해야 하기 때문이다.
그리고 HeavyThing이 아주 복잡한 데이터 구조라면, 사용 중인 모든 메모리를 해제하는 데 시간이 꽤 걸릴 수도 있다.
이건 UI나 대화형 CLI에 정말 최악이다. 사용자 요청에 응답하는 데 필요한 데이터는 이미 다 얻었는데, 정리 작업을 끝내기 전까지는 그걸로 아무 것도 할 수 없기 때문이다!
이 문제를 우회하는 방법 중 하나는, 값을 다른 스레드로 옮겨 drop을 미루고 그 스레드가 정리를 맡게 하는 것이다.
이 예시에서는 다른 스레드를 하나 생성(spawn)하고, 무거운 데이터 구조를 그 스레드로 옮긴 다음 잊어버린다. 그러면 함수는 즉시 반환하고, 미래의 어느 시점엔가 다른 스레드가 데이터 구조를 drop하고 사용된 메모리를 해제하는 작업을 시작하게 된다.
아래는 키가 100만(1M) 개인 HashMap<usize, Vec<usize>> 데이터 구조를 다루는 작은 예시다. drop을 다른 스레드로 미루는 함수는, 해야 할 일이 새 스레드를 시작하는 것뿐이므로 대략 1만(10K) 배 더 빠르게 동작한다.