문자열 성능 문제 관련 기록
이것저것 시도해보니까 string_cache
의 API가 이상적인 API인 것 같더라.
그래서 방향을 바꿨다.
프로파일링 해보면서 이것저것 실행해봤다.
그러다가 내가 실수했다는 걸 깨달았다. 내가 하려던 건 minifier의 name mangling 성능을 올리려는 거였는데, 프로파일링 결과에서 clone / drop이 시간을 다 먹고 있었다. 근데 생각해보니까 mangle 된 심볼이 문제가 아니고 원본 심볼이 문제였다... mangle 된 심볼은 짧아서 인라인되고, clone/drop이 빠른데 원본 심볼은 길어서 Arc 방식으로 관리되고 clone/drop이 느리다.
이제 ManuallyDrop
이나 transmute
를 이용해서 clone/drop을 없애면 되는 상황인데...
검색 좀 하다가 그냥 시도해보기로 했다.
그리고 처음엔 &'static JsWord
를 사용했다.
근데 잘 안 되길래 ManuallyDrop
쓰고, 제대로 된 ref counting 대신 unsafe
를 쓰는 clone
을 구현했다.
#[repr(transparent)]
#[derive(Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct FastJsWord(ManuallyDrop<JsWord>);
impl Clone for FastJsWord {
fn clone(&self) -> Self {
unsafe { Self(ManuallyDrop::new(transmute_copy(&self.0))) }
}
}
하고나서 성능 프로파일링 해보니까 5%에서 20%정도 빨라졌더라. 만족스러운 결과인 것 같다. 아직 작업할 게 조금 남긴 했는데 이 글에 적진 않겠다