diff options
31 files changed, 272 insertions, 2 deletions
diff --git a/CHECKPOINT.md b/CHECKPOINT.md index f9c180a..c0d099c 100644 --- a/CHECKPOINT.md +++ b/CHECKPOINT.md @@ -13,7 +13,7 @@ | 영역 | 확인한 것 | 근거 | |---|---|---| | 앱 표현 | 상태(수, `bool`, 정확한 64비트 정수 `i64`, text와 커서·마크, 레코드의 리스트와 키 있는 리스트, 인덱스), 입력(키, text, 필드 있는 메시지, 타이머), 원자적 이벤트 핸들러, 순수 보기(조건식, 표와 걸러진 표, count·sum·max·min·first), `fn`·`use` 라이브러리, text 비교, 시간(`now`, `every`, `floor`, `%`). 로드할 때 타입·스택·합류·커서와 인덱스의 소속을 모두 검증하고 이벤트의 실행량에 상한이 있다 | 008, [016](docs/design/016-bool-and-i64.md), aup `docs/design/002-dsl-direction.md`, aup `make check`(파이썬 참조 모델 대조, 진단 223건) | -| 수명과 계산 | 값의 수명은 선언이 말한다: `state`(저장), `transient state`(앱이 도는 동안: 저장소에 쓰지 않고 다시 시작하면 초기값, SD 카드에서 쓰기 17배), `let`(이벤트 동안). 핸들러와 보기가 계산한다: 이벤트의 리스트(`let seen: list of Seen by node`), 세는 `for i in a .. b`, `break`, 8겹까지의 중첩, 그리고 `view 이름(인자) { … return … }`(스냅숏에서 돌아 소유자를 막지 않는다). 모든 반복은 시작할 때 횟수의 상한을 갖고, 모든 이벤트와 보기는 실행량 예산(정하지 않으면 2^28 명령)과 메모리 몫(2^28 바이트) 안에서 끝난다. 노드 10만·간선 100만의 BFS 한 이벤트가 HTTP로 90 ms였고(처음 397, 020 뒤 191; CPython 452, C 9.1, 123), 022 뒤 코어는 7.4 ms다(같은 프로세스의 C 9.9): 많이 찾는 저장된 리스트를 배열과 칸의 색인으로 펴고, 열을 값만큼 좁히고, 루프 묶음을 레지스터의 기계어로 돈다(리눅스 AArch64의 JIT; 다른 곳은 실행기, 답은 같다). 다만 C를 넘은 것은 미리 읽기 덕이고, 끄면 15.7 ms로 C의 1.57배다. 일곱 가지 일(실수 루프, 배낭, 정렬, 조인, 텍스트, 행렬, BFS)로 C와 견주면 124에서는 3–300배 느렸고, 023의 계층과 표현(HASHED: 차례를 어긴 키는 해시 표의 칸에, 위치가 필요할 때 정렬)으로 지금은 1.19–5.58배(기하 평균 1.92)다(125). Pure의 표현과 뜻대로 손으로 쓴 바닥은 C의 0.90배이고 뜻의 검사는 끌어내면 0–3%라, 막는 것은 실행 계층이다(124). 모든 블록을 SSA로 올리는 최적화 계층(023)의 첫 걸음들이 들어갔고, 텍스트(실행기로 돈다)와 BFS(계층이 덧붙이기를 못 한다)가 남았다. 기계어를 만들지 않는 길로, 루프를 회차 256개의 묶음으로 돌고 연산마다 빌드 때 만든 C 루프를 쓰는 묶음 실행기(024)를 시제품으로 재니 연산을 따로 해석하면 roots 0.99배, 배낭 0.71배(4바이트 레인), BFS 1.03배, join 1.77배, 행렬 곱 2.50배이고, 행렬 곱은 곱해 더하기를 합치면 0.94배였다(계층 1.20–2.46배, 기하 평균 1.92 대 1.58, 합친 꼴로 1.24; 041, 손으로 짠 천장). 1단계(세는 루프의 레인 꼴 몸체, 회차 1024개씩)가 들어가 knapsack이 실행기에서 1,041 ms에서 13.6 ms가 됐다(계층 7.5, 안쪽 루프는 1.17배). 묶음 루프가 없는 모듈의 실행기는 명령과 사이클이 그대로다(126). 2단계(중첩 루프를 레인마다 함께, `x = x + e`·`min`·`max` 모으기)로 roots가 9.13 ms가 되어 기계어 없이 계층(9.57)보다 빠르고, matmul은 914.9에서 50.0 ms다(계층 14.3, 127). 덧붙이기, 점화식, 칸에 더하기, 걷기를 묶어 join이 실행기의 423에서 161 ms가 됐다(계층 74). 남은 값은 덧붙이기 하나 약 100 ns(실행기와 같다), join의 점화식 회차당 약 60 ns, 레인이 적은 중첩 몸체의 해석이고, BFS는 묶이지 않아 기계어를 아직 걷어낼 수 없다(128). 덧붙이기를 리스트의 한 호출로, 점화식을 레지스터 꼴로, 모으기의 끝을 차례 없이 하자 knapsack 10.8, matmul 36.4, join 118, sort 55.5 ms가 됐다(기계어 7.9, 14.2, 72–79, 35.6; 129). BFS는 프런티어 묶음으로 셈하면 차례대로 할 꼬리가 간선의 약 10%다(129). 가드 루프, 묶음 안의 걷기, 커지기만 하는 걸러내기로 BFS도 묶음으로 돌아 93에서 41 ms가 됐다(기계어 7.7, C 10). 간선당 명령 211개 대 38.5개이고, 이 꼴의 바닥(약 50개)이 기계어 위라서 기계어를 걷어내려면 합친 연산이 필요하다(130). 범용 장치만으로(같은 코드의 값 다시 쓰기, 고르기, 비트로 묻기, 아핀 `first + i`) 간선당 112개, 24.0 ms가 됐고, 범용의 바닥은 기계어의 약 2배로 보인다(131). 레지스터 타일 해석기를 시제품으로 재니(133) 산수의 사슬은 C보다 빠르고(roots 5.8 ms) 모으기가 있는 몸체는 졌으며(배낭 4배, BFS 2.4배), 같은 자리에서 꽉 짠 훑기가 BFS 기계어의 1.2배·배낭 0.4배였다: 훑기의 꼴은 옳고 3배는 구현이라, 묶음 프로그램을 로드 때 한 번 만들고 루프를 꽉 짜는 길로 간다. 그 값을 재니 배낭에서 묶음마다 0.90 µs(시간의 38%)이고, 블록의 모양에서 나오는 사실은 로드 때, 값에서 나오는 사실만 묶음마다 보는 설계를 다섯 단계로 세웠다(025). 1단계(블록의 사실을 로드 때 한 번)로 배낭의 묶음마다 값이 0.90에서 0.68 µs, 배낭이 11.48에서 10.34 ms가 됐다. 막대(0.60 µs, 10.3 ms)에는 못 미쳤고, 남은 값은 명령마다의 해석이다(134). 2단계(균일·아핀 조각을 스칼라로 한 번에)는 matmul을 38.2에서 36.1 ms로 줄였지만(중첩 회차의 해석) 배낭의 묶음마다 값은 0.63 µs에 머물렀다: 그 값은 키로 찾기와 레인 연산의 준비에 있다(135). 다음은 요소마다다. TPC-C −2.8%(기준 3% 안), 은행 질의의 명령 수는 1% 안. 같은 계산이 Pi(JIT)·WSL2·M3 Mac에서 같다. 같은 탐색을 보기로 하면 쓰기는 CPU를 나누는 만큼만 줄고(이벤트로 하면 0.2%로 멈춘다), 본문이 있는 보기는 보기의 스레드(`--view-workers`)가 계산해 연결 스레드를 막지 않는다(쓰기 최대 지연이 CPU만 나눌 때의 1.0배, 연결 스레드 하나에서 묻는 연결 둘이 1.95배) | [018](docs/design/018-lifetimes-and-computation.md), [020](docs/design/020-computing-faster.md), [117](docs/research/117-transient-states.md), [118](docs/research/118-computing-in-one-event.md), [119](docs/research/119-views-that-compute.md), [121](docs/research/121-computing-faster.md), [122](docs/research/122-views-off-the-connection-threads.md), [021](docs/design/021-past-c.md), [123](docs/research/123-past-c.md), [022](docs/design/022-arrays-and-registers.md), [124](docs/research/124-against-c.md), [023](docs/design/023-optimizing-tier.md), [125](docs/research/125-tier-first-steps.md), [024](docs/design/024-batch-executor.md), [126](docs/research/126-batch-executor-stage-one.md), [127](docs/research/127-batch-executor-stage-two.md), [128](docs/research/128-batch-executor-tables-and-costs.md), [129](docs/research/129-batch-executor-costs-cut.md), [130](docs/research/130-batch-executor-frontiers.md), [131](docs/research/131-batch-executor-general-cuts.md), [132](docs/research/132-batch-executor-floor-and-the-way-past.md), [133](docs/research/133-register-tiles-measured.md), [025](docs/design/025-batch-programs.md), [134](docs/research/134-batch-plans-stage-one.md), [135](docs/research/135-batch-plans-stage-two.md) | +| 수명과 계산 | 값의 수명은 선언이 말한다: `state`(저장), `transient state`(앱이 도는 동안: 저장소에 쓰지 않고 다시 시작하면 초기값, SD 카드에서 쓰기 17배), `let`(이벤트 동안). 핸들러와 보기가 계산한다: 이벤트의 리스트(`let seen: list of Seen by node`), 세는 `for i in a .. b`, `break`, 8겹까지의 중첩, 그리고 `view 이름(인자) { … return … }`(스냅숏에서 돌아 소유자를 막지 않는다). 모든 반복은 시작할 때 횟수의 상한을 갖고, 모든 이벤트와 보기는 실행량 예산(정하지 않으면 2^28 명령)과 메모리 몫(2^28 바이트) 안에서 끝난다. 노드 10만·간선 100만의 BFS 한 이벤트가 HTTP로 90 ms였고(처음 397, 020 뒤 191; CPython 452, C 9.1, 123), 022 뒤 코어는 7.4 ms다(같은 프로세스의 C 9.9): 많이 찾는 저장된 리스트를 배열과 칸의 색인으로 펴고, 열을 값만큼 좁히고, 루프 묶음을 레지스터의 기계어로 돈다(리눅스 AArch64의 JIT; 다른 곳은 실행기, 답은 같다). 다만 C를 넘은 것은 미리 읽기 덕이고, 끄면 15.7 ms로 C의 1.57배다. 일곱 가지 일(실수 루프, 배낭, 정렬, 조인, 텍스트, 행렬, BFS)로 C와 견주면 124에서는 3–300배 느렸고, 023의 계층과 표현(HASHED: 차례를 어긴 키는 해시 표의 칸에, 위치가 필요할 때 정렬)으로 지금은 1.19–5.58배(기하 평균 1.92)다(125). Pure의 표현과 뜻대로 손으로 쓴 바닥은 C의 0.90배이고 뜻의 검사는 끌어내면 0–3%라, 막는 것은 실행 계층이다(124). 모든 블록을 SSA로 올리는 최적화 계층(023)의 첫 걸음들이 들어갔고, 텍스트(실행기로 돈다)와 BFS(계층이 덧붙이기를 못 한다)가 남았다. 기계어를 만들지 않는 길로, 루프를 회차 256개의 묶음으로 돌고 연산마다 빌드 때 만든 C 루프를 쓰는 묶음 실행기(024)를 시제품으로 재니 연산을 따로 해석하면 roots 0.99배, 배낭 0.71배(4바이트 레인), BFS 1.03배, join 1.77배, 행렬 곱 2.50배이고, 행렬 곱은 곱해 더하기를 합치면 0.94배였다(계층 1.20–2.46배, 기하 평균 1.92 대 1.58, 합친 꼴로 1.24; 041, 손으로 짠 천장). 1단계(세는 루프의 레인 꼴 몸체, 회차 1024개씩)가 들어가 knapsack이 실행기에서 1,041 ms에서 13.6 ms가 됐다(계층 7.5, 안쪽 루프는 1.17배). 묶음 루프가 없는 모듈의 실행기는 명령과 사이클이 그대로다(126). 2단계(중첩 루프를 레인마다 함께, `x = x + e`·`min`·`max` 모으기)로 roots가 9.13 ms가 되어 기계어 없이 계층(9.57)보다 빠르고, matmul은 914.9에서 50.0 ms다(계층 14.3, 127). 덧붙이기, 점화식, 칸에 더하기, 걷기를 묶어 join이 실행기의 423에서 161 ms가 됐다(계층 74). 남은 값은 덧붙이기 하나 약 100 ns(실행기와 같다), join의 점화식 회차당 약 60 ns, 레인이 적은 중첩 몸체의 해석이고, BFS는 묶이지 않아 기계어를 아직 걷어낼 수 없다(128). 덧붙이기를 리스트의 한 호출로, 점화식을 레지스터 꼴로, 모으기의 끝을 차례 없이 하자 knapsack 10.8, matmul 36.4, join 118, sort 55.5 ms가 됐다(기계어 7.9, 14.2, 72–79, 35.6; 129). BFS는 프런티어 묶음으로 셈하면 차례대로 할 꼬리가 간선의 약 10%다(129). 가드 루프, 묶음 안의 걷기, 커지기만 하는 걸러내기로 BFS도 묶음으로 돌아 93에서 41 ms가 됐다(기계어 7.7, C 10). 간선당 명령 211개 대 38.5개이고, 이 꼴의 바닥(약 50개)이 기계어 위라서 기계어를 걷어내려면 합친 연산이 필요하다(130). 범용 장치만으로(같은 코드의 값 다시 쓰기, 고르기, 비트로 묻기, 아핀 `first + i`) 간선당 112개, 24.0 ms가 됐고, 범용의 바닥은 기계어의 약 2배로 보인다(131). 레지스터 타일 해석기를 시제품으로 재니(133) 산수의 사슬은 C보다 빠르고(roots 5.8 ms) 모으기가 있는 몸체는 졌으며(배낭 4배, BFS 2.4배), 같은 자리에서 꽉 짠 훑기가 BFS 기계어의 1.2배·배낭 0.4배였다: 훑기의 꼴은 옳고 3배는 구현이라, 묶음 프로그램을 로드 때 한 번 만들고 루프를 꽉 짜는 길로 간다. 그 값을 재니 배낭에서 묶음마다 0.90 µs(시간의 38%)이고, 블록의 모양에서 나오는 사실은 로드 때, 값에서 나오는 사실만 묶음마다 보는 설계를 다섯 단계로 세웠다(025). 1단계(블록의 사실을 로드 때 한 번)로 배낭의 묶음마다 값이 0.90에서 0.68 µs, 배낭이 11.48에서 10.34 ms가 됐다. 막대(0.60 µs, 10.3 ms)에는 못 미쳤고, 남은 값은 명령마다의 해석이다(134). 2단계(균일·아핀 조각을 스칼라로 한 번에)는 matmul을 38.2에서 36.1 ms로 줄였지만(중첩 회차의 해석) 배낭의 묶음마다 값은 0.63 µs에 머물렀다: 그 값은 키로 찾기와 레인 연산의 준비에 있다(135). 다음은 요소마다다. 3단계(4바이트 곱하기, 레인 없이 시작하는 모으기, 리스트의 칸을 묶음에 한 번)로 b9 대비 matmul 40.0 → 26.0 ms, knapsack 11.5 → 10.1, roots 9.0 → 8.3이 됐고(기계어 14.2, 7.9, 9.57), 실행기와 은행 질의의 명령 수, TPC-C는 그대로다(136). TPC-C −2.8%(기준 3% 안), 은행 질의의 명령 수는 1% 안. 같은 계산이 Pi(JIT)·WSL2·M3 Mac에서 같다. 같은 탐색을 보기로 하면 쓰기는 CPU를 나누는 만큼만 줄고(이벤트로 하면 0.2%로 멈춘다), 본문이 있는 보기는 보기의 스레드(`--view-workers`)가 계산해 연결 스레드를 막지 않는다(쓰기 최대 지연이 CPU만 나눌 때의 1.0배, 연결 스레드 하나에서 묻는 연결 둘이 1.95배) | [018](docs/design/018-lifetimes-and-computation.md), [020](docs/design/020-computing-faster.md), [117](docs/research/117-transient-states.md), [118](docs/research/118-computing-in-one-event.md), [119](docs/research/119-views-that-compute.md), [121](docs/research/121-computing-faster.md), [122](docs/research/122-views-off-the-connection-threads.md), [021](docs/design/021-past-c.md), [123](docs/research/123-past-c.md), [022](docs/design/022-arrays-and-registers.md), [124](docs/research/124-against-c.md), [023](docs/design/023-optimizing-tier.md), [125](docs/research/125-tier-first-steps.md), [024](docs/design/024-batch-executor.md), [126](docs/research/126-batch-executor-stage-one.md), [127](docs/research/127-batch-executor-stage-two.md), [128](docs/research/128-batch-executor-tables-and-costs.md), [129](docs/research/129-batch-executor-costs-cut.md), [130](docs/research/130-batch-executor-frontiers.md), [131](docs/research/131-batch-executor-general-cuts.md), [132](docs/research/132-batch-executor-floor-and-the-way-past.md), [133](docs/research/133-register-tiles-measured.md), [025](docs/design/025-batch-programs.md), [134](docs/research/134-batch-plans-stage-one.md), [135](docs/research/135-batch-plans-stage-two.md), [136](docs/research/136-batch-executor-stage-three.md) | | 보기 밀기 | 보기의 `GET`에 `Accept: text/event-stream`이면 그 값을 민다(SSE, 브라우저의 `EventSource` 그대로). 같은 보기와 인자를 보는 구독자는 계산 한 번을 나누고, 값이 바뀔 때만, 많아야 10 ms마다 한 번 보낸다. 느린 구독자에게는 가장 새 값 하나만 기다리게 한다. 모듈이 바뀌어도 같은 이름의 보기로 이어 가고, 토큰을 빼면 끊는다. 구독자 1,000에 쓰기 초당 100번까지 신선도 p99 11 ms 이하, 초당 1번이면 100 ms 폴링의 약 10분의 1 CPU(이벤트 하나와 요청 하나의 값이 같아 메시지 수의 비다), 구독자 1만에 구독자마다 0.3–0.4 KiB, 1만에게 퍼지기까지 p99 45 ms | [019](docs/design/019-pushing-views.md), [120](docs/research/120-pushing-views.md) | | 영속 | 선언한 상태가 곧 영속 상태다. 목록은 이미지와 로그(저장마다 바뀐 기록 한 항목, 재사용하는 할당 구간, 앞 항목의 다이제스트로 이어짐)에, 나머지는 트리 저장소에(커밋당 한 연속 구간과 동기화 한 번). 이벤트 묶음마다 저장 한 번, 이미지는 소유자 밖에서 체크포인트. `kill -9`와 커밋 각 단계의 죽음 뒤 확인 응답한 이벤트가 모두 남는다. 레코드·키가 바뀐 모듈로 바꿔도 데이터가 이름으로 옮겨진다 | [076](docs/research/076-one-sync-commit.md), [081](docs/research/081-tail-records.md), [092](docs/research/092-tpcc.md), 008 상태 영속·교체 | | 인터페이스 | 한 명세가 TUI(셀 단위 갱신), CLI, 문장(NUI), 웹 GUI가 된다. 저장하면 실행 중인 앱이 상태를 이어 새 모듈로 바뀐다(`aup watch`, `vega … --watch`) | Vega `docs/design/001-first-component.md`, Vega `make check`(가상 터미널, 헤드리스 Chromium 포함) | diff --git a/docs/design/025-batch-programs.md b/docs/design/025-batch-programs.md index d7f9fd3..c3123b7 100644 --- a/docs/design/025-batch-programs.md +++ b/docs/design/025-batch-programs.md @@ -6,7 +6,10 @@ 10.51 ms(놓인 자리); 막대 ≤ 9.2 ms, ≤ 0.45 µs, ≤ 33 ms에 못 미쳤다. 조각은 중첩 회차의 수단이고, 묶음마다 값은 키로 찾기와 레인 연산의 준비에 있어 이 꼴로는 약 0.6 µs에서 멈춘다. 리스트의 칸 캐시는 3%라 하지 않았다). 다음은 요소마다다(3단계: 4바이트 곱하기, matmul ≤ 21 ms). 4바이트 곱하기 뒤 matmul은 26.57 ms다(명령 −20%). 막대의 셈은 "실수 연산 22 ms 밖은 14 ms 그대로"였는데, 그 밖은 -안쪽 회차마다의 해석 약 15 ms와 행렬 만들기(점화식과 덧붙이기 8만 개) 약 4–5 ms였다: 26.6 ≈ 커널 8 + 회차마다 15 + 만들기 4–5. [024](024-batch-executor.md)가 처음에 적고 만들지 않은 단계("묶음 프로그램은 루프마다 한 번 +안쪽 회차마다의 해석 약 15 ms와 행렬 만들기(점화식과 덧붙이기 8만 개) 약 4–5 ms였다: 26.6 ≈ 커널 8 + 회차마다 15 + 만들기 4–5. 3단계를 +닫았다([136](../research/136-batch-executor-stage-three.md): 곱하기, 레인 없이 시작하는 모으기(sum0 6.09 → 1.01 ms, 막대 ≤ 1.5), +리스트의 칸을 묶음에 한 번; b9 대비 matmul −35%, knapsack −12%, roots −7.6%; 실행기, 은행 질의, TPC-C는 그대로). 다음은 4단계(knapsack의 +훑기 여섯을 셋으로). [024](024-batch-executor.md)가 처음에 적고 만들지 않은 단계("묶음 프로그램은 루프마다 한 번 만든다")이고, [132](../research/132-batch-executor-floor-and-the-way-past.md)의 A, [133](../research/133-register-tiles-measured.md)이 정한 길이다. 사용자의 방향: 범용 장치로, 합친 연산의 표 없이, 기계어 없이, 메모리를 적게(2026-10-05, 2026-10-08). diff --git a/docs/research/136-batch-executor-stage-three.md b/docs/research/136-batch-executor-stage-three.md new file mode 100644 index 0000000..9252469 --- /dev/null +++ b/docs/research/136-batch-executor-stage-three.md @@ -0,0 +1,65 @@ +# 136 — 묶음 실행기 3단계: 4바이트 곱하기, 레인 없이 시작하는 모으기, 리스트의 칸 한 번 + +2026-10-08. [025](../design/025-batch-programs.md)의 3단계다. 요소마다의 값을 연산의 꼴과 폭에 맞춘 루프로 줄였다. 코드는 `5ffae0b` +(4바이트 곱하기), `c74bb65`(레인 없이 시작하는 모으기), `79d016c`(리스트의 칸을 묶음에 한 번)이고, 같은 방법으로 쟀다(`b12`, `b13`, +`b14`; 11번의 중앙값을 번갈아 다섯 번씩, b9와도 세 번씩; 명령 수). + +## 쉬운 말로 + +- **matmul의 막대에 못 미쳤다.** 4바이트 곱하기 뒤 matmul은 26.57 ms다(막대 ≤ 21). 막대의 셈이 실수 연산(약 22 ms) 밖을 14 ms로 두었는데, + 그 밖은 안쪽 회차마다의 해석 약 15 ms와 행렬 만들기 약 4–5 ms였다. 지금 matmul은 커널 약 8 ms + 회차마다 약 14 ms + 만들기 약 + 4–5 ms다. +- **sum0의 막대는 넘었다.** `total = total + 1`의 모으기가 레인을 만들지 않게 하자 sum0이 6.09에서 1.01 ms가 됐다(막대 ≤ 1.5). 명령은 + 85% 줄었다. 이제 sum0의 시간은 거의 묶음마다의 값이다: 묶음 3,907개 × 약 0.25 µs. 세 줄의 블록에 묶음마다 약 1,666 명령이 이 해석기 + 꼴의 바닥이다(레인의 일이 없어진 뒤에 남는 것). +- **b9와 견주면**(같은 조용한 기기, 번갈아): matmul 40.01 → 25.97 ms(−35%, 명령 −26%), knapsack 11.47 → 10.07(−12%, 명령 −5.6%), + roots 8.97 → 8.29(−7.6%, 명령 −7.5%), join 117.2 → 115.8(−1.2%), BFS 24.07 → 24.10, sort 57.0 → 56.8. words는 묶이지 않는 일이고 + 215.4 → 219.2(+1.8%, 놓인 자리의 폭). +- **지키는 것은 지켰다.** 실행기만의 길은 다섯 일 모두 명령 수가 b9와 같다. 은행 질의의 명령 수는 b9와 ±0.08% 안이다. TPC-C(창고 1, + 단말 64, 20초, 번갈아 여섯 번)는 b9 116.3만 대 지금 117.1만 신규 주문/분(+0.7%)이다. + +## 만든 것 + +- **4바이트 곱하기**(`words_op`). 2^32 아래의 정수 레인끼리의 곱이 2^32 아래면 4바이트에 그대로 둔다. 2^32 아래 정수의 곱은 실수의 + 곱과 비트까지 같다. 넘으면(64비트 곱의 위쪽 절반) 더하기처럼 레인을 실수로 돌려 다시 한다. 레인 넷에 `umull`, `umull2`, `uzp1`, + `uzp2`로 명령 10개다. matmul의 곱과 합이 4바이트에 머물러 명령이 20% 줄었다. BFS의 `q.node * 1048576`은 2^32를 넘어 한 번 해 보고 + 실수로 가는데, 명령으로 0.05%다. +- **레인 없이 시작하는 모으기.** 모으기는 레인 배열 없이 수 둘(모든 레인에 같은 부분합과 같은 횟수)로 시작한다. 걸음마다 e가 모든 + 레인에 같은 값이고 가린 레인이 없으면, 각 레인이 할 계산(같은 차례의 같은 연산)을 한 번만 한다. 처음으로 다른 걸음(가린 레인, + 레인마다 다른 e, 고르기, 펼친 걷기)이 오면 그때 레인을 그 수로 채운다. 끝에서는 정수이고 크기가 2^53 아래면 n × 그 수를 더하고(레인의 + 합과 같다), 아니면 회차의 차례대로 접는다. 지금의 검사(정수인지, 2^53, 여러 번 더한 레인)가 그대로다. + - 고정 소스 `REDUCE_SOURCE`를 더했다. 같은 e, 균일한 최대·최소, 분수, 2^53 너머, 중첩 루프 안의 횟수, 같은 e 다음의 가린 걸음과 + 레인마다의 걸음(양쪽 차례)이다. 이 소스가 레인을 그 수로 채우는 길을 56번, 그 수로 접는 길을 77번 지난다. 시드 23의 무작위 + 프로그램은 각각 6번과 53번의 실행에서 지났다. +- **리스트의 칸을 묶음에 한 번**(`cells_of`). `pass`는 리스트를 바꾸지 않는다(grep: 바꾸는 호출 `widen`, `add_many`, `touched`는 + `settle`, 묶음의 끝, 덧붙이기와 걸러내기에만 있다). 그래서 `find`와 `item_get`이 묶음마다 처음 읽는 리스트 넷의 칸을 한 번 가져와 + 쓴다. matmul은 안쪽 회차마다 찾기 둘이라 명령 2.3%, knapsack과 BFS는 0.4%다. 135에서 3%라 미뤘지만 matmul에서는 9%였다. +- **하지 않은 것.** `sweep`(matmul의 회차마다 약 130 사이클)은 1단계부터 블록이 쓰는 지역 변수만 돌고, matmul의 회차는 매번 버퍼를 + 새로 쓰므로 건너뛸 수 없다. 025의 "좁은 열을 4바이트로 바로"는 이미 그렇다(`cells_at`이 1바이트 열을 4바이트 레인으로 읽는다). + +## 잰 것 + +| 일 | b9 | b12 (곱하기) | b13 (모으기) | b14 (칸) | 기계어 | C | +|---|---:|---:|---:|---:|---:|---:| +| matmul | 40.01 ms | 26.56 | 26.76 | **25.97** | 14.2 | 7.6 | +| knapsack | 11.47 | 10.52 | 10.56 | **10.07** | 7.9 | 6.25 | +| roots | 8.97 | 8.82 | 8.31 | **8.29** | 9.57 | 6.86 | +| join | 117.2 | 116.4 | 116.0 | 115.8 | 84.6 | 31.7 | +| BFS | 24.07 | 24.31 | 24.03 | 24.10 | 7.7 | 9.9 | +| sum0 (time.c) | 8.69 | | **1.01** | | | | + +- 실행기만의 join은 한 번의 `icount`에서 사이클이 +11%였는데, 다시 두 번 재니 b9와 ±2% 안이었다(명령은 같다). + +원본: `041-batches/2026-10-08-pairs.jsonl`, `2026-10-08-counts.jsonl`, `040-against-c/2026-10-08-counts.jsonl`(은행 질의), +`2026-10-08-tpcc-*`, `2026-10-08-queries-*`. + +## 뜻과 맞음 + +- 커밋마다 시드 1, 2, 3, 5, 23의 무작위 프로그램(기본과 `PURE_SELECT=all`), 고정 소스의 세 길(두 모드), 단위 시험이 지났다. +- 단계의 끝(`79d016c`와 `REDUCE_SOURCE`)에서 단위 시험 세 모드, ASan 단위 시험(기본과 실행기 모드), sanitized `pure-run`의 고정 소스 + (두 모드)와 시드 23의 프로그램(두 모드), Pure의 `make check`, aup의 검사 두 모드가 지났다. + +## 다음 + +knapsack의 요소마다(약 6 ms, 훑기 여섯)가 이제 스위트에서 손대지 않은 가장 큰 덩어리다. 4단계: 열을 피연산자로 읽기(보폭 읽기가 +레인 배열로 옮기는 훑기 없이), 비교가 가는 레인을 세기(가르기의 세는 훑기 없이). 배낭은 훑기 여섯에서 셋이다. diff --git a/research/experiments/040-against-c/2026-10-08-counts.jsonl b/research/experiments/040-against-c/2026-10-08-counts.jsonl new file mode 100644 index 0000000..9ded043 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-counts.jsonl @@ -0,0 +1,4 @@ +{"serve": "pure-serve", "per_branch": {"instructions": 27084449, "cycles": 11968165}, "in_credit": {"instructions": 3511883, "cycles": 1642481}, "large": {"instructions": 1419139, "cycles": 694322}, "ranks": {"instructions": 24469168, "cycles": 14816231}, "none": {"instructions": 615600, "cycles": 198839}, "field": {"instructions": 9007132, "cycles": 3270346}, "found": {"instructions": 14139059, "cycles": 10647982}} +{"serve": "pure-serve", "per_branch": {"instructions": 26979581, "cycles": 12079370}, "in_credit": {"instructions": 3488341, "cycles": 1623673}, "large": {"instructions": 1419195, "cycles": 618093}, "ranks": {"instructions": 24411710, "cycles": 15102017}, "none": {"instructions": 615600, "cycles": 199844}, "field": {"instructions": 9007132, "cycles": 3258526}, "found": {"instructions": 14138874, "cycles": 10788782}} +{"serve": "pure-serve", "per_branch": {"instructions": 27066442, "cycles": 11989768}, "in_credit": {"instructions": 3507837, "cycles": 1610192}, "large": {"instructions": 1419139, "cycles": 616080}, "ranks": {"instructions": 24460594, "cycles": 14902801}, "none": {"instructions": 615600, "cycles": 193159}, "field": {"instructions": 9007132, "cycles": 3277228}, "found": {"instructions": 14140402, "cycles": 10893077}} +{"serve": "pure-serve", "per_branch": {"instructions": 27195249, "cycles": 12143448}, "in_credit": {"instructions": 3536801, "cycles": 1672046}, "large": {"instructions": 1419139, "cycles": 612837}, "ranks": {"instructions": 24530686, "cycles": 15174100}, "none": {"instructions": 615600, "cycles": 194135}, "field": {"instructions": 9007235, "cycles": 3279139}, "found": {"instructions": 14137235, "cycles": 10915766}} diff --git a/research/experiments/040-against-c/2026-10-08-load.txt b/research/experiments/040-against-c/2026-10-08-load.txt new file mode 100644 index 0000000..e17ec65 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-load.txt @@ -0,0 +1,12 @@ +1 s9 16:22:57 up 4 days, 12:44, 2 users, load average: 1.32, 1.34, 1.11 +1 s14 16:24:25 up 4 days, 12:45, 2 users, load average: 1.47, 1.44, 1.17 +2 s14 16:26:01 up 4 days, 12:47, 2 users, load average: 1.35, 1.49, 1.22 +2 s9 16:27:49 up 4 days, 12:49, 2 users, load average: 1.46, 1.55, 1.27 +3 s9 16:29:16 up 4 days, 12:50, 2 users, load average: 1.48, 1.60, 1.32 +3 s14 16:30:53 up 4 days, 12:52, 2 users, load average: 1.37, 1.63, 1.36 +4 s14 16:32:30 up 4 days, 12:53, 2 users, load average: 1.31, 1.60, 1.38 +4 s9 16:34:07 up 4 days, 12:55, 2 users, load average: 1.32, 1.60, 1.41 +5 s9 16:35:34 up 4 days, 12:56, 2 users, load average: 1.34, 1.58, 1.42 +5 s14 16:37:01 up 4 days, 12:58, 2 users, load average: 1.46, 1.64, 1.46 +6 s14 16:38:48 up 4 days, 13:00, 2 users, load average: 1.33, 1.67, 1.50 +6 s9 16:40:15 up 4 days, 13:01, 2 users, load average: 1.37, 1.65, 1.51 diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-1.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-1.jsonl new file mode 100644 index 0000000..8ab0066 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-1.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.32, "pure_fastest_ms": 5.25, "sqlite_median_ms": 44.93, "sqlite_fastest_ms": 44.85, "sqlite_indexed_median_ms": 14.11, "sqlite_indexed_fastest_ms": 14.05} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.83, "pure_fastest_ms": 0.8, "sqlite_median_ms": 5.9, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.38, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.48, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.77, "pure_fastest_ms": 6.7, "sqlite_median_ms": 2842.0, "sqlite_fastest_ms": 2838.67, "sqlite_indexed_median_ms": 7.55, "sqlite_indexed_fastest_ms": 7.5} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-2.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-2.jsonl new file mode 100644 index 0000000..28b485a --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-2.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.31, "pure_fastest_ms": 5.2, "sqlite_median_ms": 45.25, "sqlite_fastest_ms": 45.09, "sqlite_indexed_median_ms": 14.0, "sqlite_indexed_fastest_ms": 13.96} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.85, "pure_fastest_ms": 0.82, "sqlite_median_ms": 5.89, "sqlite_fastest_ms": 5.86, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.37, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.49, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.5, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.89, "pure_fastest_ms": 6.79, "sqlite_median_ms": 2841.84, "sqlite_fastest_ms": 2838.85, "sqlite_indexed_median_ms": 7.61, "sqlite_indexed_fastest_ms": 7.53} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-3.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-3.jsonl new file mode 100644 index 0000000..37c986b --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-3.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.25, "pure_fastest_ms": 5.18, "sqlite_median_ms": 45.25, "sqlite_fastest_ms": 45.17, "sqlite_indexed_median_ms": 14.02, "sqlite_indexed_fastest_ms": 13.96} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.85, "pure_fastest_ms": 0.81, "sqlite_median_ms": 5.89, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.38, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.48, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.85, "pure_fastest_ms": 6.75, "sqlite_median_ms": 2845.71, "sqlite_fastest_ms": 2840.64, "sqlite_indexed_median_ms": 7.61, "sqlite_indexed_fastest_ms": 7.52} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-4.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-4.jsonl new file mode 100644 index 0000000..1b0f465 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-4.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.35, "pure_fastest_ms": 5.22, "sqlite_median_ms": 45.23, "sqlite_fastest_ms": 45.13, "sqlite_indexed_median_ms": 14.1, "sqlite_indexed_fastest_ms": 14.03} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.89, "pure_fastest_ms": 0.82, "sqlite_median_ms": 5.89, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.38, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.49, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.83, "pure_fastest_ms": 6.78, "sqlite_median_ms": 2843.8, "sqlite_fastest_ms": 2840.72, "sqlite_indexed_median_ms": 7.61, "sqlite_indexed_fastest_ms": 7.51} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-5.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-5.jsonl new file mode 100644 index 0000000..5a42b6c --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-5.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.25, "pure_fastest_ms": 5.19, "sqlite_median_ms": 45.23, "sqlite_fastest_ms": 45.16, "sqlite_indexed_median_ms": 14.11, "sqlite_indexed_fastest_ms": 14.05} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.87, "pure_fastest_ms": 0.82, "sqlite_median_ms": 5.9, "sqlite_fastest_ms": 5.88, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.37, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.49, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.49, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.82, "pure_fastest_ms": 6.71, "sqlite_median_ms": 2842.74, "sqlite_fastest_ms": 2840.54, "sqlite_indexed_median_ms": 7.59, "sqlite_indexed_fastest_ms": 7.52} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s14-6.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s14-6.jsonl new file mode 100644 index 0000000..34ee9bf --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s14-6.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.27, "pure_fastest_ms": 5.23, "sqlite_median_ms": 45.48, "sqlite_fastest_ms": 45.29, "sqlite_indexed_median_ms": 14.07, "sqlite_indexed_fastest_ms": 14.06} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.91, "pure_fastest_ms": 0.83, "sqlite_median_ms": 5.91, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.49, "pure_fastest_ms": 0.41, "sqlite_median_ms": 1.53, "sqlite_fastest_ms": 1.48, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.77, "pure_fastest_ms": 6.68, "sqlite_median_ms": 2841.65, "sqlite_fastest_ms": 2838.36, "sqlite_indexed_median_ms": 7.61, "sqlite_indexed_fastest_ms": 7.53} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-1.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-1.jsonl new file mode 100644 index 0000000..1892a39 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-1.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.22, "pure_fastest_ms": 5.13, "sqlite_median_ms": 45.97, "sqlite_fastest_ms": 44.91, "sqlite_indexed_median_ms": 14.07, "sqlite_indexed_fastest_ms": 14.01} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.82, "pure_fastest_ms": 0.79, "sqlite_median_ms": 5.91, "sqlite_fastest_ms": 5.88, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.37, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.5, "sqlite_fastest_ms": 1.49, "sqlite_indexed_median_ms": 1.5, "sqlite_indexed_fastest_ms": 1.49} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.72, "pure_fastest_ms": 6.65, "sqlite_median_ms": 2841.05, "sqlite_fastest_ms": 2837.7, "sqlite_indexed_median_ms": 7.66, "sqlite_indexed_fastest_ms": 7.56} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-2.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-2.jsonl new file mode 100644 index 0000000..9861f6f --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-2.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.28, "pure_fastest_ms": 5.18, "sqlite_median_ms": 45.47, "sqlite_fastest_ms": 45.23, "sqlite_indexed_median_ms": 14.09, "sqlite_indexed_fastest_ms": 14.04} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.84, "pure_fastest_ms": 0.8, "sqlite_median_ms": 5.89, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.38, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.48, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.46} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.66, "pure_fastest_ms": 6.6, "sqlite_median_ms": 2841.94, "sqlite_fastest_ms": 2837.62, "sqlite_indexed_median_ms": 7.58, "sqlite_indexed_fastest_ms": 7.51} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-3.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-3.jsonl new file mode 100644 index 0000000..e938103 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-3.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.23, "pure_fastest_ms": 5.17, "sqlite_median_ms": 45.27, "sqlite_fastest_ms": 45.13, "sqlite_indexed_median_ms": 14.11, "sqlite_indexed_fastest_ms": 14.04} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.81, "pure_fastest_ms": 0.78, "sqlite_median_ms": 5.9, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.47, "pure_fastest_ms": 0.45, "sqlite_median_ms": 1.98, "sqlite_fastest_ms": 1.96, "sqlite_indexed_median_ms": 1.49, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.81, "pure_fastest_ms": 6.67, "sqlite_median_ms": 2842.97, "sqlite_fastest_ms": 2839.88, "sqlite_indexed_median_ms": 7.71, "sqlite_indexed_fastest_ms": 7.58} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-4.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-4.jsonl new file mode 100644 index 0000000..8fbac45 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-4.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.37, "pure_fastest_ms": 5.2, "sqlite_median_ms": 45.03, "sqlite_fastest_ms": 44.9, "sqlite_indexed_median_ms": 14.2, "sqlite_indexed_fastest_ms": 14.02} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.85, "pure_fastest_ms": 0.79, "sqlite_median_ms": 5.9, "sqlite_fastest_ms": 5.87, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.39, "pure_fastest_ms": 0.36, "sqlite_median_ms": 1.48, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.47, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.8, "pure_fastest_ms": 6.63, "sqlite_median_ms": 2841.51, "sqlite_fastest_ms": 2839.17, "sqlite_indexed_median_ms": 7.55, "sqlite_indexed_fastest_ms": 7.51} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-5.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-5.jsonl new file mode 100644 index 0000000..367b66e --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-5.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 5.91, "pure_fastest_ms": 5.67, "sqlite_median_ms": 45.1, "sqlite_fastest_ms": 44.84, "sqlite_indexed_median_ms": 14.14, "sqlite_indexed_fastest_ms": 14.07} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.83, "pure_fastest_ms": 0.78, "sqlite_median_ms": 5.94, "sqlite_fastest_ms": 5.89, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.39, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.51, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.48, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 8.3, "pure_fastest_ms": 6.69, "sqlite_median_ms": 2844.17, "sqlite_fastest_ms": 2840.26, "sqlite_indexed_median_ms": 7.59, "sqlite_indexed_fastest_ms": 7.53} diff --git a/research/experiments/040-against-c/2026-10-08-queries-s9-6.jsonl b/research/experiments/040-against-c/2026-10-08-queries-s9-6.jsonl new file mode 100644 index 0000000..f2326e4 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-queries-s9-6.jsonl @@ -0,0 +1,4 @@ +{"query": "per_branch", "rows": 10, "accounts": 100000, "pure_median_ms": 6.36, "pure_fastest_ms": 5.6, "sqlite_median_ms": 45.02, "sqlite_fastest_ms": 44.78, "sqlite_indexed_median_ms": 14.13, "sqlite_indexed_fastest_ms": 14.09} +{"query": "in_credit", "rows": 1, "accounts": 100000, "pure_median_ms": 0.8, "pure_fastest_ms": 0.78, "sqlite_median_ms": 5.93, "sqlite_fastest_ms": 5.89, "sqlite_indexed_median_ms": 0.16, "sqlite_indexed_fastest_ms": 0.16} +{"query": "large", "rows": 212, "accounts": 100000, "pure_median_ms": 0.37, "pure_fastest_ms": 0.35, "sqlite_median_ms": 1.48, "sqlite_fastest_ms": 1.47, "sqlite_indexed_median_ms": 1.47, "sqlite_indexed_fastest_ms": 1.47} +{"query": "ranks", "rows": 404, "accounts": 100000, "pure_median_ms": 6.68, "pure_fastest_ms": 6.59, "sqlite_median_ms": 2845.17, "sqlite_fastest_ms": 2840.45, "sqlite_indexed_median_ms": 7.57, "sqlite_indexed_fastest_ms": 7.5} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-1.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-1.jsonl new file mode 100644 index 0000000..01245ab --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-1.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.55, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43268, "new_orders_per_minute": 1157814, "undone_new_orders": 3696, "errors": 0, "new_order": {"done": 389639, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "payment": {"done": 371876, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "order_status": {"done": 34715, "failed": 0, "p50_us": 272, "p99_us": 1600}, "delivery": {"done": 34662, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "stock_level": {"done": 34473, "failed": 0, "p50_us": 320, "p99_us": 1728}, "server_threads": "3", "cpu_us_per_transaction": 44.8, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 457.1, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 457.1, "pure_state_mib": 230.7, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27214, "burst_events": 792567, "checkpoints": 38}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-2.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-2.jsonl new file mode 100644 index 0000000..f2544b5 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-2.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.6, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43828, "new_orders_per_minute": 1172531, "undone_new_orders": 3755, "errors": 0, "new_order": {"done": 394599, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "payment": {"done": 376774, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "order_status": {"done": 35151, "failed": 0, "p50_us": 272, "p99_us": 1472}, "delivery": {"done": 35116, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "stock_level": {"done": 34919, "failed": 0, "p50_us": 320, "p99_us": 1664}, "server_threads": "3", "cpu_us_per_transaction": 45.0, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 462.7, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 462.7, "pure_state_mib": 233.3, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27852, "burst_events": 802821, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-3.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-3.jsonl new file mode 100644 index 0000000..cd30413 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-3.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.57, "pure_load_s": 0.65, "sqlite_load_s": 1.57, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43857, "new_orders_per_minute": 1173370, "undone_new_orders": 3747, "errors": 0, "new_order": {"done": 394872, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "payment": {"done": 377021, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "order_status": {"done": 35170, "failed": 0, "p50_us": 288, "p99_us": 1472}, "delivery": {"done": 35132, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "stock_level": {"done": 34941, "failed": 0, "p50_us": 320, "p99_us": 1600}, "server_threads": "3", "cpu_us_per_transaction": 45.0, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 462.7, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 462.7, "pure_state_mib": 233.5, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27586, "burst_events": 803363, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-4.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-4.jsonl new file mode 100644 index 0000000..e99fbc7 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-4.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.58, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43727, "new_orders_per_minute": 1169756, "undone_new_orders": 3742, "errors": 0, "new_order": {"done": 393661, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "payment": {"done": 375969, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "order_status": {"done": 35088, "failed": 0, "p50_us": 288, "p99_us": 1536}, "delivery": {"done": 34997, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "stock_level": {"done": 34833, "failed": 0, "p50_us": 336, "p99_us": 1600}, "server_threads": "3", "cpu_us_per_transaction": 45.1, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 461.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 461.9, "pure_state_mib": 232.8, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27840, "burst_events": 800970, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-5.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-5.jsonl new file mode 100644 index 0000000..34b913d --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-5.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.56, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 44245, "new_orders_per_minute": 1183964, "undone_new_orders": 3801, "errors": 0, "new_order": {"done": 398470, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "payment": {"done": 380311, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "order_status": {"done": 35472, "failed": 0, "p50_us": 272, "p99_us": 1344}, "delivery": {"done": 35417, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "stock_level": {"done": 35270, "failed": 0, "p50_us": 320, "p99_us": 1408}, "server_threads": "3", "cpu_us_per_transaction": 44.6, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 466.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 466.9, "pure_state_mib": 235.4, "pure_store_mib": 246.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27676, "burst_events": 810479, "checkpoints": 40}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s14-6.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s14-6.jsonl new file mode 100644 index 0000000..9d8548a --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s14-6.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.64, "sqlite_load_s": 1.57, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43446, "new_orders_per_minute": 1162307, "undone_new_orders": 3724, "errors": 0, "new_order": {"done": 391165, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "payment": {"done": 373501, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "order_status": {"done": 34852, "failed": 0, "p50_us": 272, "p99_us": 1536}, "delivery": {"done": 34779, "failed": 0, "p50_us": 1408, "p99_us": 4096}, "stock_level": {"done": 34640, "failed": 0, "p50_us": 320, "p99_us": 1728}, "server_threads": "3", "cpu_us_per_transaction": 45.1, "core_shares": {"pure-owner": 0.87, "pure-checkpoint": 0.01}, "resident_mib": 459.0, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 459.0, "pure_state_mib": 231.5, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27240, "burst_events": 795807, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-1.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-1.jsonl new file mode 100644 index 0000000..1ce46b3 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-1.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.59, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 42571, "new_orders_per_minute": 1138875, "undone_new_orders": 3636, "errors": 0, "new_order": {"done": 383262, "failed": 0, "p50_us": 1472, "p99_us": 4352}, "payment": {"done": 365985, "failed": 0, "p50_us": 1408, "p99_us": 4352}, "order_status": {"done": 34157, "failed": 0, "p50_us": 272, "p99_us": 1664}, "delivery": {"done": 34101, "failed": 0, "p50_us": 1408, "p99_us": 4608}, "stock_level": {"done": 33926, "failed": 0, "p50_us": 320, "p99_us": 1792}, "server_threads": "3", "cpu_us_per_transaction": 45.3, "core_shares": {"pure-owner": 0.87, "pure-checkpoint": 0.01}, "resident_mib": 450.5, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 450.5, "pure_state_mib": 227.3, "pure_store_mib": 230.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 26595, "burst_events": 779797, "checkpoints": 38}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-2.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-2.jsonl new file mode 100644 index 0000000..d11edfc --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-2.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.56, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43257, "new_orders_per_minute": 1157193, "undone_new_orders": 3698, "errors": 0, "new_order": {"done": 389429, "failed": 0, "p50_us": 1472, "p99_us": 3840}, "payment": {"done": 371903, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "order_status": {"done": 34691, "failed": 0, "p50_us": 288, "p99_us": 1408}, "delivery": {"done": 34628, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "stock_level": {"done": 34485, "failed": 0, "p50_us": 320, "p99_us": 1472}, "server_threads": "3", "cpu_us_per_transaction": 45.7, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 456.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 456.9, "pure_state_mib": 230.6, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 26938, "burst_events": 792348, "checkpoints": 38}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-3.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-3.jsonl new file mode 100644 index 0000000..2b18a3d --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-3.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.55, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43179, "new_orders_per_minute": 1155181, "undone_new_orders": 3684, "errors": 0, "new_order": {"done": 388747, "failed": 0, "p50_us": 1472, "p99_us": 3968}, "payment": {"done": 371169, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "order_status": {"done": 34640, "failed": 0, "p50_us": 272, "p99_us": 1472}, "delivery": {"done": 34609, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "stock_level": {"done": 34428, "failed": 0, "p50_us": 320, "p99_us": 1728}, "server_threads": "3", "cpu_us_per_transaction": 45.3, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 456.1, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 456.1, "pure_state_mib": 230.2, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27048, "burst_events": 790926, "checkpoints": 38}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-4.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-4.jsonl new file mode 100644 index 0000000..b0fc954 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-4.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.67, "sqlite_load_s": 1.55, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43828, "new_orders_per_minute": 1172606, "undone_new_orders": 3756, "errors": 0, "new_order": {"done": 394625, "failed": 0, "p50_us": 1472, "p99_us": 3712}, "payment": {"done": 376799, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "order_status": {"done": 35116, "failed": 0, "p50_us": 272, "p99_us": 1472}, "delivery": {"done": 35099, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "stock_level": {"done": 34928, "failed": 0, "p50_us": 320, "p99_us": 1600}, "server_threads": "3", "cpu_us_per_transaction": 45.3, "core_shares": {"pure-owner": 0.89, "pure-checkpoint": 0.01}, "resident_mib": 462.2, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 462.2, "pure_state_mib": 233.4, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27677, "burst_events": 802851, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-5.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-5.jsonl new file mode 100644 index 0000000..f13985c --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-5.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.63, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 43662, "new_orders_per_minute": 1168176, "undone_new_orders": 3740, "errors": 0, "new_order": {"done": 393132, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "payment": {"done": 375324, "failed": 0, "p50_us": 1408, "p99_us": 3968}, "order_status": {"done": 34997, "failed": 0, "p50_us": 272, "p99_us": 1536}, "delivery": {"done": 34990, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "stock_level": {"done": 34805, "failed": 0, "p50_us": 320, "p99_us": 1600}, "server_threads": "3", "cpu_us_per_transaction": 45.1, "core_shares": {"pure-owner": 0.88, "pure-checkpoint": 0.01}, "resident_mib": 460.7, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 460.7, "pure_state_mib": 232.5, "pure_store_mib": 238.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27485, "burst_events": 799789, "checkpoints": 39}} diff --git a/research/experiments/040-against-c/2026-10-08-tpcc-s9-6.jsonl b/research/experiments/040-against-c/2026-10-08-tpcc-s9-6.jsonl new file mode 100644 index 0000000..10a6273 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-08-tpcc-s9-6.jsonl @@ -0,0 +1,3 @@ +{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.65, "sqlite_load_s": 1.56, "sqlite_page_size": 4096, "pure_resident_mib": 40.3, "sqlite_file_mib": 13.8} +{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 44338, "new_orders_per_minute": 1186242, "undone_new_orders": 3798, "errors": 0, "new_order": {"done": 399212, "failed": 0, "p50_us": 1408, "p99_us": 3840}, "payment": {"done": 381130, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "order_status": {"done": 35554, "failed": 0, "p50_us": 272, "p99_us": 1472}, "delivery": {"done": 35518, "failed": 0, "p50_us": 1408, "p99_us": 3712}, "stock_level": {"done": 35355, "failed": 0, "p50_us": 320, "p99_us": 1664}, "server_threads": "3", "cpu_us_per_transaction": 44.6, "core_shares": {"pure-owner": 0.89, "pure-checkpoint": 0.01}, "resident_mib": 467.2, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []} +{"step": "end", "pure_resident_mib": 467.2, "pure_state_mib": 235.8, "pure_store_mib": 246.7, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 27935, "burst_events": 812140, "checkpoints": 40}} diff --git a/research/experiments/041-batches/2026-10-08-counts.jsonl b/research/experiments/041-batches/2026-10-08-counts.jsonl index d259259..6770a54 100644 --- a/research/experiments/041-batches/2026-10-08-counts.jsonl +++ b/research/experiments/041-batches/2026-10-08-counts.jsonl @@ -66,3 +66,13 @@ {"version":"b13","way":"rounds","work":"roots","instructions":2755945389,"cycles":987937588} {"version":"b13","way":"batches","work":"join","instructions":1862428182,"cycles":1070892757} {"version":"b13","way":"rounds","work":"join","instructions":7669661642,"cycles":3261839112} +{"version":"b14","way":"batches","work":"bfs","instructions":3367636863,"cycles":1668001492} +{"version":"b14","way":"rounds","work":"bfs","instructions":4711634132,"cycles":2090008896} +{"version":"b14","way":"batches","work":"knapsack","instructions":372331557,"cycles":117955187} +{"version":"b14","way":"rounds","work":"knapsack","instructions":21688103016,"cycles":7544708847} +{"version":"b14","way":"batches","work":"matmul","instructions":718548121,"cycles":242024080} +{"version":"b14","way":"rounds","work":"matmul","instructions":21436715931,"cycles":6621517691} +{"version":"b14","way":"batches","work":"roots","instructions":156139120,"cycles":109411693} +{"version":"b14","way":"rounds","work":"roots","instructions":2755945510,"cycles":988490613} +{"version":"b14","way":"batches","work":"join","instructions":1868676355,"cycles":1061229557} +{"version":"b14","way":"rounds","work":"join","instructions":7669661592,"cycles":3636019220} diff --git a/research/experiments/041-batches/2026-10-08-pairs.jsonl b/research/experiments/041-batches/2026-10-08-pairs.jsonl index 7d1343f..36dd15a 100644 --- a/research/experiments/041-batches/2026-10-08-pairs.jsonl +++ b/research/experiments/041-batches/2026-10-08-pairs.jsonl @@ -308,3 +308,95 @@ {"version":"b13","way":"batches","turn":5,"work":"join","pure_median_ms":118.155,"c_median_ms":30.847,"ratio":3.830,"agree":true} {"version":"b13","way":"batches","turn":5,"work":"matmul","pure_median_ms":26.718,"c_median_ms":7.599,"ratio":3.516,"agree":true} {"version":"b13","way":"batches","turn":5,"work":"bfs","pure_median_ms":24.025,"c_median_ms":10.005,"ratio":2.401,"agree":true} +{"version":"b13","way":"batches","turn":1,"work":"roots","pure_median_ms":8.316,"c_median_ms":6.869,"ratio":1.211,"agree":true} +{"version":"b13","way":"batches","turn":1,"work":"knapsack","pure_median_ms":10.680,"c_median_ms":6.296,"ratio":1.696,"agree":true} +{"version":"b13","way":"batches","turn":1,"work":"join","pure_median_ms":114.792,"c_median_ms":29.910,"ratio":3.838,"agree":true} +{"version":"b13","way":"batches","turn":1,"work":"matmul","pure_median_ms":26.754,"c_median_ms":7.542,"ratio":3.547,"agree":true} +{"version":"b13","way":"batches","turn":1,"work":"bfs","pure_median_ms":24.127,"c_median_ms":10.223,"ratio":2.360,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"roots","pure_median_ms":8.282,"c_median_ms":6.865,"ratio":1.206,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"knapsack","pure_median_ms":10.048,"c_median_ms":6.224,"ratio":1.614,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"join","pure_median_ms":115.119,"c_median_ms":30.225,"ratio":3.809,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"matmul","pure_median_ms":25.998,"c_median_ms":7.535,"ratio":3.450,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"bfs","pure_median_ms":24.029,"c_median_ms":9.958,"ratio":2.413,"agree":true} +{"version":"b13","way":"batches","turn":2,"work":"roots","pure_median_ms":8.355,"c_median_ms":6.879,"ratio":1.215,"agree":true} +{"version":"b13","way":"batches","turn":2,"work":"knapsack","pure_median_ms":10.627,"c_median_ms":6.281,"ratio":1.692,"agree":true} +{"version":"b13","way":"batches","turn":2,"work":"join","pure_median_ms":114.690,"c_median_ms":32.100,"ratio":3.573,"agree":true} +{"version":"b13","way":"batches","turn":2,"work":"matmul","pure_median_ms":26.708,"c_median_ms":7.540,"ratio":3.542,"agree":true} +{"version":"b13","way":"batches","turn":2,"work":"bfs","pure_median_ms":23.920,"c_median_ms":10.065,"ratio":2.377,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"roots","pure_median_ms":8.285,"c_median_ms":6.865,"ratio":1.207,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"knapsack","pure_median_ms":10.050,"c_median_ms":6.224,"ratio":1.615,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"join","pure_median_ms":115.790,"c_median_ms":31.902,"ratio":3.630,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"matmul","pure_median_ms":25.976,"c_median_ms":7.538,"ratio":3.446,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"bfs","pure_median_ms":23.984,"c_median_ms":9.983,"ratio":2.403,"agree":true} +{"version":"b13","way":"batches","turn":3,"work":"roots","pure_median_ms":8.309,"c_median_ms":6.865,"ratio":1.210,"agree":true} +{"version":"b13","way":"batches","turn":3,"work":"knapsack","pure_median_ms":10.540,"c_median_ms":6.227,"ratio":1.693,"agree":true} +{"version":"b13","way":"batches","turn":3,"work":"join","pure_median_ms":115.973,"c_median_ms":31.762,"ratio":3.651,"agree":true} +{"version":"b13","way":"batches","turn":3,"work":"matmul","pure_median_ms":26.773,"c_median_ms":7.518,"ratio":3.561,"agree":true} +{"version":"b13","way":"batches","turn":3,"work":"bfs","pure_median_ms":24.051,"c_median_ms":10.067,"ratio":2.389,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"roots","pure_median_ms":8.280,"c_median_ms":6.866,"ratio":1.206,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"knapsack","pure_median_ms":10.034,"c_median_ms":6.229,"ratio":1.611,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"join","pure_median_ms":117.243,"c_median_ms":31.426,"ratio":3.731,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"matmul","pure_median_ms":25.945,"c_median_ms":7.523,"ratio":3.449,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"bfs","pure_median_ms":24.154,"c_median_ms":10.190,"ratio":2.370,"agree":true} +{"version":"b13","way":"batches","turn":4,"work":"roots","pure_median_ms":8.312,"c_median_ms":6.861,"ratio":1.211,"agree":true} +{"version":"b13","way":"batches","turn":4,"work":"knapsack","pure_median_ms":10.576,"c_median_ms":6.226,"ratio":1.699,"agree":true} +{"version":"b13","way":"batches","turn":4,"work":"join","pure_median_ms":116.402,"c_median_ms":29.137,"ratio":3.995,"agree":true} +{"version":"b13","way":"batches","turn":4,"work":"matmul","pure_median_ms":26.717,"c_median_ms":7.663,"ratio":3.487,"agree":true} +{"version":"b13","way":"batches","turn":4,"work":"bfs","pure_median_ms":24.260,"c_median_ms":10.011,"ratio":2.423,"agree":true} +{"version":"b14","way":"batches","turn":4,"work":"roots","pure_median_ms":8.287,"c_median_ms":6.863,"ratio":1.207,"agree":true} +{"version":"b14","way":"batches","turn":4,"work":"knapsack","pure_median_ms":10.163,"c_median_ms":6.448,"ratio":1.576,"agree":true} +{"version":"b14","way":"batches","turn":4,"work":"join","pure_median_ms":115.463,"c_median_ms":30.471,"ratio":3.789,"agree":true} +{"version":"b14","way":"batches","turn":4,"work":"matmul","pure_median_ms":25.997,"c_median_ms":7.540,"ratio":3.448,"agree":true} +{"version":"b14","way":"batches","turn":4,"work":"bfs","pure_median_ms":24.003,"c_median_ms":10.093,"ratio":2.378,"agree":true} +{"version":"b13","way":"batches","turn":5,"work":"roots","pure_median_ms":8.308,"c_median_ms":6.861,"ratio":1.211,"agree":true} +{"version":"b13","way":"batches","turn":5,"work":"knapsack","pure_median_ms":10.533,"c_median_ms":6.267,"ratio":1.681,"agree":true} +{"version":"b13","way":"batches","turn":5,"work":"join","pure_median_ms":115.249,"c_median_ms":31.876,"ratio":3.616,"agree":true} +{"version":"b13","way":"batches","turn":5,"work":"matmul","pure_median_ms":26.792,"c_median_ms":7.545,"ratio":3.551,"agree":true} +{"version":"b13","way":"batches","turn":5,"work":"bfs","pure_median_ms":24.135,"c_median_ms":10.019,"ratio":2.409,"agree":true} +{"version":"b14","way":"batches","turn":5,"work":"roots","pure_median_ms":8.300,"c_median_ms":6.873,"ratio":1.207,"agree":true} +{"version":"b14","way":"batches","turn":5,"work":"knapsack","pure_median_ms":10.102,"c_median_ms":6.227,"ratio":1.622,"agree":true} +{"version":"b14","way":"batches","turn":5,"work":"join","pure_median_ms":117.360,"c_median_ms":31.328,"ratio":3.746,"agree":true} +{"version":"b14","way":"batches","turn":5,"work":"matmul","pure_median_ms":25.966,"c_median_ms":7.539,"ratio":3.444,"agree":true} +{"version":"b14","way":"batches","turn":5,"work":"bfs","pure_median_ms":24.080,"c_median_ms":10.060,"ratio":2.394,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"roots","pure_median_ms":8.962,"c_median_ms":6.872,"ratio":1.304,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"knapsack","pure_median_ms":11.500,"c_median_ms":6.240,"ratio":1.843,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"sort","pure_median_ms":56.898,"c_median_ms":26.876,"ratio":2.117,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"join","pure_median_ms":119.329,"c_median_ms":31.836,"ratio":3.748,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"words","pure_median_ms":216.527,"c_median_ms":38.123,"ratio":5.680,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"matmul","pure_median_ms":40.022,"c_median_ms":7.521,"ratio":5.322,"agree":true} +{"version":"b9","way":"batches","turn":1,"work":"bfs","pure_median_ms":24.087,"c_median_ms":9.953,"ratio":2.420,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"roots","pure_median_ms":8.286,"c_median_ms":6.863,"ratio":1.207,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"knapsack","pure_median_ms":10.067,"c_median_ms":6.231,"ratio":1.616,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"sort","pure_median_ms":56.739,"c_median_ms":26.883,"ratio":2.111,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"join","pure_median_ms":115.954,"c_median_ms":31.075,"ratio":3.731,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"words","pure_median_ms":217.494,"c_median_ms":38.742,"ratio":5.614,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"matmul","pure_median_ms":25.983,"c_median_ms":7.546,"ratio":3.443,"agree":true} +{"version":"b14","way":"batches","turn":1,"work":"bfs","pure_median_ms":24.120,"c_median_ms":10.133,"ratio":2.380,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"roots","pure_median_ms":8.965,"c_median_ms":6.869,"ratio":1.305,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"knapsack","pure_median_ms":11.418,"c_median_ms":6.231,"ratio":1.832,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"sort","pure_median_ms":56.910,"c_median_ms":26.892,"ratio":2.116,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"join","pure_median_ms":116.789,"c_median_ms":30.559,"ratio":3.822,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"words","pure_median_ms":214.333,"c_median_ms":39.039,"ratio":5.490,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"matmul","pure_median_ms":40.032,"c_median_ms":7.601,"ratio":5.266,"agree":true} +{"version":"b9","way":"batches","turn":2,"work":"bfs","pure_median_ms":24.051,"c_median_ms":10.104,"ratio":2.380,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"roots","pure_median_ms":8.286,"c_median_ms":6.867,"ratio":1.207,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"knapsack","pure_median_ms":10.107,"c_median_ms":6.230,"ratio":1.622,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"sort","pure_median_ms":56.756,"c_median_ms":26.876,"ratio":2.112,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"join","pure_median_ms":115.280,"c_median_ms":30.595,"ratio":3.768,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"words","pure_median_ms":220.892,"c_median_ms":38.701,"ratio":5.708,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"matmul","pure_median_ms":25.951,"c_median_ms":7.535,"ratio":3.444,"agree":true} +{"version":"b14","way":"batches","turn":2,"work":"bfs","pure_median_ms":24.336,"c_median_ms":9.945,"ratio":2.447,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"roots","pure_median_ms":8.963,"c_median_ms":6.863,"ratio":1.306,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"knapsack","pure_median_ms":11.456,"c_median_ms":6.247,"ratio":1.834,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"sort","pure_median_ms":57.041,"c_median_ms":26.902,"ratio":2.120,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"join","pure_median_ms":117.863,"c_median_ms":31.866,"ratio":3.699,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"words","pure_median_ms":213.690,"c_median_ms":39.481,"ratio":5.412,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"matmul","pure_median_ms":39.951,"c_median_ms":7.982,"ratio":5.005,"agree":true} +{"version":"b9","way":"batches","turn":3,"work":"bfs","pure_median_ms":24.316,"c_median_ms":10.086,"ratio":2.411,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"roots","pure_median_ms":8.287,"c_median_ms":6.863,"ratio":1.208,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"knapsack","pure_median_ms":10.071,"c_median_ms":6.228,"ratio":1.617,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"sort","pure_median_ms":56.973,"c_median_ms":26.895,"ratio":2.118,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"join","pure_median_ms":115.795,"c_median_ms":32.216,"ratio":3.594,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"words","pure_median_ms":219.174,"c_median_ms":38.390,"ratio":5.709,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"matmul","pure_median_ms":25.934,"c_median_ms":7.564,"ratio":3.428,"agree":true} +{"version":"b14","way":"batches","turn":3,"work":"bfs","pure_median_ms":27.887,"c_median_ms":10.578,"ratio":2.636,"agree":true} |
