각 호출이 다음 호출로 이어질 때

우열 없음 async

요구사항

네 개의 API 단계가 엄격히 하나씩 차례로 실행됩니다 — 로그인, 프로필, 주문, 청구서 — 그리고 각 요청은 이전 응답으로부터 만들어집니다(세션 id가 프로필 호출로, 사용자 id가 주문 호출로, …). 각 단계를 그 응답과 함께 출력하세요. 가짜 API 테이블은 코드에 들어 있습니다; 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.

예상 출력
login -> session-9
profile -> user-42
orders -> order-7
invoice -> pdf-3

나란히 보기

RxDart

FxDart

차이가 나는 이유

순차성 자체는 어느 모델도 애써 얻을 필요가 없습니다. RxDart의 asyncMap은 각 future가 도는 동안 소스를 일시 정지 시키므로 호출은 구조적으로 직렬이고; 풀 파이프라인은 이전 값이 풀린 뒤에야 다음 값을 요청하므로 기본적으로 직렬입니다. 흥미로운 차이는 의존성 — 각 응답이 다음 요청에 건네주는 토큰 — 이 어디에 사는가입니다.

RxDart 쪽은 매퍼가 클로저로 붙드는 가변 변수를 통해 그것을 꿰어 갑니다: 관용적이고 간결하지만 파이프라인의 살짝 바깥에 있습니다 — 단계 사이의 데이터 흐름이 연산자 체인에는 보이지 않습니다. FxDart 쪽은 scan의 누산기를 통해 꿰므로 이전 응답이 다음 단계의 명시적 입력이 됩니다; 대가는 scan이 시드를 내보낸다는 것이고, 출력부가 그것을 건너뛰어야 합니다. 숨은 변수 하나 vs 건너뛴 시드 줄 하나 — 상태를 클로저에 붙잡아 두는 쪽과 폴드에 드러내는 쪽 중 무엇을 선호하는가로 갈리는, 진짜 무승부입니다.

벤치마크

Apple M1 Max, RAM 32 GB · Dart 3.12.2 (AOT 컴파일) · 2026-08-18

비동기 예제입니다. 대표 스케일이 1,000,000이 아니라 N = 10,000인 이유 — 원소 하나마다 양쪽 모두 이벤트 루프를 한 바퀴 돌아야 하므로, 실제 await 백만 번은 파이프라인이 아니라 Dart 이벤트 루프를 몇 분씩 재게 됩니다. 지연은 0으로 두고 예제의 동시성 제한은 그대로 유지합니다. 막대가 비교하는 것은 파이프라인 기계 장치 자체입니다.

N = 100

시간 무승부

RxDart 432 µs
FxDart 415 µs

최대 메모리 무승부

RxDart 16.5 MB
FxDart 16.5 MB

N = 10,000

시간 무승부

RxDart 35.9 ms
FxDart 36.1 ms

최대 메모리 무승부

RxDart 28.2 MB
FxDart 28.6 MB

막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.