Perf100 결과 — 2026-08-14
상태: 통과 — 3위 이내 100/100개, 1위 83/100개
Perf100이란?
Perf100은 Sollang의 성능을 검증하기 위한 재현 가능한 벤치마크 모음입니다. 이름의 100은 서로 다른 알고리즘 100개를 뜻하는 것이 아니라, 20개 알고리즘군을 각각 5개 입력 프로필로 실행한 총 100개 측정 사례를 뜻합니다. 각 사례는 Sollang, C++, Rust, C# NativeAOT, Go, Java에서 동일한 작업을 구현하고, 출력이 바이트 단위로 같은지 확인한 뒤 동일 조건에서 실행 시간 순위를 비교했습니다. 목표는 Sollang이 모든 사례에서 3위 이내를 기록하면서 1위 사례를 확대하는 것이였습니다.
측정 계약과 출처
- 원시 보고서 SHA-256:
1da27b9d77e5e4065d74b1e54b64d06a65024939b2cac10c1715a2f8968e1dc1(338,384바이트) - 측정 시간:
2026-08-14T10:22:39.710Z부터2026-08-14T10:41:14.629Z까지 - 호스트: Intel(R) Core™ Ultra 9 275HX; Linux 6.18.33.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 18 21:54:43 UTC 2026 x86_64 GNU/Linux
- 측정 방식: 표본마다 새 프로세스를 실행하며, 준비 실행은 호스트 캐시만 예열하고 언어 런타임 상태나 JIT 상태를 유지하지 않음; 언어·사례별 준비 실행 2회와 측정 7회
- 유휴 CPU 게이트: 전체 CPU 사용률 10.00% 이하; 실행 세션 1개; 허용된 최대 관측값 7.883%
- 순위 분포: 1위 83개, 2위 17개, 3위 0개, 목표 미달 0개
모든 사례는 시간을 측정하기 전에 Sollang, C++, Rust, C# NativeAOT, Go, Java의 표준 출력이 바이트 단위로 같은지 확인 함. 원시 보고서에는 모든 측정 표본, 중앙값 절대 편차(MAD), 범위, 최대 RSS, 실행 파일·소스 식별 정보와 빌드 시간도 보존 함.
도구 체인
| 구현 | 도구 체인 | 빌드 시간(ms) | 실행 파일 크기(바이트) | SHA-256 | 최대 RSS(KiB) |
|---|---|---|---|---|---|
| sollang | Sollang 0.4.260813 | 1128 | 35848 | fc525a38b0738db198ec6■■6675390ac904b0460f3f6958b53751ac53f26648b |
40372 |
| cpp | g++ (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 | 650 | 21352 | 50a629d72d93dfe681ec3028a5e17749b4b5a51484f5fa85099c419c0c8f208b |
81028 |
| rust | rustc 1.97.1 (8bab26f4f 2026-07-14) | 1021 | 4377832 | 9f0e9f42ef15af76cdacd744a235048a0aa1fc2bd401d65d4ea3b5ca865ac7d2 |
79764 |
| csharp-nativeaot | 10.0.110 | 1889 | 1282528 | 797993697636de1467fb6233aae39be0478fa78a550d3abdb688f6a30da6b458 |
81368 |
| go | go version go1.26.5 linux/amd64 | 365 | 1597602 | cb626eab18e7ce3dcc8cdcf6a90acc9303d19afb61f3c07a5c766e05f3592bba |
80736 |
| java | openjdk 25.0.4 2026-07-21 LTS | 581 | 2704 | b779be29208fde6964d095087d6d9b98d5edc028f368ceb8c742d5bf109d5b4f |
126820 |
알고리즘군별 결과
| ID | 알고리즘군 | 분류 | Sollang | C++ | Rust | C# NativeAOT | Go | Java | Sollang 1위 횟수 | Sollang 최하 순위 | Sollang 중앙값 범위(ms) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | linear-sum | 정수 연산 | 1, 1, 1, 1, 1 | 5, 6, 6, 6, 6 | 2, 2, 2, 2, 2 | 3, 4, 3, 3, 4 | 4, 3, 4, 4, 3 | 6, 5, 5, 5, 5 | 5/5 | 1 | 49.118–224.332 |
| 2 | square-mod | 정수 연산 | 1, 1, 1, 1, 1 | 5, 6, 6, 6, 6 | 2, 2, 2, 2, 2 | 3, 3, 3, 3, 3 | 4, 4, 4, 4, 4 | 6, 5, 5, 5, 5 | 5/5 | 1 | 28.369–116.803 |
| 3 | affine-recurrence | 정수 연산 | 1, 1, 1, 1, 1 | 5, 6, 6, 6, 6 | 2, 2, 3, 3, 3 | 3, 3, 2, 2, 2 | 4, 4, 4, 4, 4 | 6, 5, 5, 5, 5 | 5/5 | 1 | 40.114–180.474 |
| 4 | branch-mix | 분기 | 1, 1, 1, 1, 1 | 6, 6, 6, 6, 6 | 2, 2, 2, 3, 3 | 3, 3, 3, 2, 2 | 4, 4, 4, 4, 4 | 5, 5, 5, 5, 5 | 5/5 | 1 | 51.912–236.259 |
| 5 | gcd-batch | 정수 연산 | 1, 1, 1, 1, 1 | 5, 5, 6, 6, 6 | 2, 2, 2, 2, 2 | 3, 3, 3, 3, 3 | 4, 4, 4, 4, 4 | 6, 6, 5, 5, 5 | 5/5 | 1 | 26.301–89.555 |
| 6 | collatz-total | 분기 | 1, 1, 1, 1, 1 | 5, 6, 6, 6, 6 | 2, 2, 2, 2, 2 | 3, 3, 3, 3, 3 | 4, 4, 4, 4, 4 | 6, 5, 5, 5, 5 | 5/5 | 1 | 12.717–49.735 |
| 7 | prime-count | 정수 연산 | 1, 1, 1, 2, 2 | 2, 3, 3, 3, 3 | 3, 2, 2, 1, 1 | 4, 5, 4, 5, 5 | 5, 4, 5, 4, 4 | 6, 6, 6, 6, 6 | 3/5 | 2 | 4.041–10.234 |
| 8 | divisor-sum | 정수 연산 | 2, 2, 2, 2, 2 | 3, 4, 4, 4, 4 | 1, 1, 1, 1, 1 | 5, 5, 5, 5, 5 | 4, 3, 3, 3, 3 | 6, 6, 6, 6, 6 | 0/5 | 2 | 8.447–61.008 |
| 9 | fibonacci-batch | 함수 호출 | 1, 1, 1, 1, 1 | 3, 3, 3, 3, 3 | 2, 2, 2, 2, 2 | 4, 4, 4, 4, 4 | 5, 5, 5, 5, 5 | 6, 6, 6, 6, 6 | 5/5 | 1 | 7.578–16.085 |
| 10 | polynomial-horner | 부동소수점 | 1, 1, 1, 1, 1 | 6, 6, 6, 6, 6 | 2, 3, 3, 3, 3 | 3, 2, 2, 2, 2 | 4, 4, 4, 4, 4 | 5, 5, 5, 5, 5 | 5/5 | 1 | 220.084–1073.611 |
| 11 | nested-triangular | 반복 | 1, 1, 1, 1, 1 | 2, 2, 2, 2, 2 | 3, 3, 3, 3, 3 | 4, 4, 5, 4, 4 | 5, 5, 4, 5, 5 | 6, 6, 6, 6, 6 | 5/5 | 1 | 8.539–115.643 |
| 12 | minmax-stream | 분기 | 1, 2, 2, 2, 2 | 5, 6, 6, 6, 6 | 3, 3, 3, 3, 3 | 2, 1, 1, 1, 1 | 4, 4, 4, 4, 4 | 6, 5, 5, 5, 5 | 1/5 | 2 | 73.103–341.580 |
| 13 | array-fill-sum | 메모리 | 1, 1, 1, 1, 1 | 3, 5, 5, 5, 5 | 2, 2, 2, 2, 2 | 4, 3, 4, 3, 3 | 5, 4, 3, 4, 4 | 6, 6, 6, 6, 6 | 5/5 | 1 | 8.763–31.493 |
| 14 | array-reverse-sum | 메모리 | 1, 1, 1, 1, 1 | 3, 5, 5, 5, 5 | 2, 2, 2, 2, 2 | 4, 3, 3, 4, 3 | 5, 4, 4, 3, 4 | 6, 6, 6, 6, 6 | 5/5 | 1 | 8.630–30.710 |
| 15 | array-stride-sum | 메모리 | 1, 1, 1, 1, 1 | 5, 5, 5, 5, 5 | 2, 2, 2, 2, 2 | 4, 3, 3, 3, 3 | 3, 4, 4, 4, 4 | 6, 6, 6, 6, 6 | 5/5 | 1 | 14.670–84.166 |
| 16 | array-prefix-sum | 메모리 | 1, 1, 1, 1, 1 | 3, 5, 5, 5, 5 | 2, 2, 2, 2, 2 | 4, 4, 4, 4, 3 | 5, 3, 3, 3, 4 | 6, 6, 6, 6, 6 | 5/5 | 1 | 8.294–33.330 |
| 17 | insertion-sort | 정렬 | 1, 2, 2, 2, 1 | 2, 1, 1, 1, 2 | 3, 3, 3, 3, 3 | 4, 4, 4, 4, 4 | 5, 5, 5, 5, 5 | 6, 6, 6, 6, 6 | 2/5 | 2 | 3.615–4.761 |
| 18 | prime-sieve | 메모리 | 1, 1, 1, 1, 1 | 2, 2, 2, 2, 2 | 3, 3, 3, 3, 3 | 4, 4, 4, 5, 5 | 5, 5, 5, 4, 4 | 6, 6, 6, 6, 6 | 5/5 | 1 | 4.686–10.110 |
| 19 | matrix-multiply | 부동소수점 | 2, 1, 1, 2, 2 | 1, 2, 2, 1, 1 | 3, 3, 3, 3, 3 | 4, 4, 4, 4, 4 | 5, 5, 5, 5, 5 | 6, 6, 6, 6, 6 | 2/5 | 2 | 3.438–4.108 |
| 20 | binary-search | 검색 | 1, 1, 1, 1, 1 | 3, 3, 4, 3, 4 | 2, 2, 2, 2, 2 | 5, 4, 5, 5, 5 | 4, 5, 3, 4, 3 | 6, 6, 6, 6, 6 | 5/5 | 1 | 70.424–756.324 |
소수 판별 알고리즘 개선
첫 번째 전체 기준선에서는 단일 배열을 사용하는 가장 큰 소수 판별 사례 하나가 실패 했습니다. 비교 언어들은 저장 공간을 한 번에 할당했지만 Sollang은 확장 가능한 Bool 배열을 수백만 번 push해 초기화하면서 5위가 되었습니다. 따라서 Sollang만 유리하게 바꾸지 않고 여섯 구현 모두를 동일한 분할 체(segmented sieve) 방식으로 변경하였습니다. 이 방식은 32,768개 Int64 원소의 세그먼트, Int64 기반 합성수 표, 동일한 초기화·배수 표시·개수 집계 순서, 변경하지 않은 입력과 체크섬을 사용 함. 최종 전체 측정에서 소수 판별 프로필 5개는 모두 Sollang이 1위를 기록하였습니다.