Perf100 벤치마크 결과를 공유합니다.

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위를 기록하였습니다.

1 Like