← All issues

Promise combinator fast path for non-thenable elements

4ed24b8

ECMAScript 명세는 Promise.all/allSettled/any/race가 각 입력 값에 대해 Promise.resolve(element)를 호출하도록 규정하고 있습니다. 이 과정에서 callable .then 프로퍼티가 있는지 확인합니다. Non-thenable 값의 경우, 이 과정은 오직 downstream callback을 microtask로 큐에 넣기 위한 fulfilled Promise를 생성하는 데 그칩니다. 이는 순수한 할당 오버헤드입니다. 이 최적화가 안전하려면 thenability 검사가 관찰 가능한 side effect 없이 수행될 수 있어야 합니다.

이 commit에서는 정적으로 non-thenable임이 확인된 요소에 대해 중간 Promise.resolve(value) JSPromise 셀 할당을 건너뛰는 fast path가 추가되었습니다. 대신 resolver microtask를 직접 큐에 삽입합니다. 새로운 isNonThenable predicate가 이 최적화의 진입 조건을 제어합니다.

primitive나 plain object로 구성된 배열에서 1.4~1.7배의 성능 향상이 벤치마크에서 확인되었습니다. 다만 isNonThenable predicate가 완벽하게 정확해야 합니다. false positive가 하나라도 발생하면 관찰 가능한 ECMAScript 동작이 달라집니다.

🔒

The soundness of the new thenability predicate across object model edge cases is worth close inspection — audit directions included.

더 확인하려면 구독해 주세요