sgcPivotGrid 벤치마크

1,000,000행과 10,000,000행에서 측정한 sgcPivotGrid 엔진 TsgcPivotEngine의 시간입니다. 데이터 로드, 세 가지 피벗 레이아웃을 단일 패스와 병렬 계산으로 재계산하는 시간, 데이터 위에 엔진이 추가로 사용하는 메모리를 다룹니다. 모든 수치는 sgcUI 데모에 포함된 벤치마크 프로그램에서 나온 것이므로, 같은 테스트를 직접 하드웨어에서 실행할 수 있습니다.

13.9 ms
1,000,000행 재계산, Sum, 단일 패스
121.1 ms
10,000,000행 재계산, Sum, 단일 패스
46.9 ms
10,000,000행, Sum, 스레드 4개 병렬 계산
1,384.0 ms
AppendRow로 10,000,000행 로드

Win64, Delphi 13, 워밍업 1회 후 5회 실행의 중앙값이며, 아래에 설명한 테스트 머신에서 측정했습니다. Win64 결과, Win32 결과, QA 예산, 직접 테스트하는 방법으로 바로 이동할 수 있습니다.

측정 대상

행은 고정된 시드로 생성되므로 모든 머신이 같은 피벗을 계산합니다. 모든 모드에서 P1 총합계가 값 열의 합계와 같은지 확인합니다.

시나리오프로그램의 동작
로드텍스트 값 3개, 숫자 1개, 날짜 1개로 이루어진 1,000,000행 또는 10,000,000행을 AppendRow로 추가합니다. 텍스트는 도착하는 대로 멤버 인덱스로 인코딩됩니다. 두 번째 단계에서는 Store.SetFloat로 숫자 열을 100,000개의 고유 값으로 채웁니다.
P1 Sum행 필드 2개(50개 지역 x 20개 제품, 소계와 총합계를 포함해 행 항목 1,051개)와 열 필드 1개(12개월), 값 하나의 Sum. 기본 피벗입니다.
P3 CountDistinct고유 값이 100,000개인 열의 고유 값을 세는 P1 레이아웃으로, 표준 집계 중 가장 비용이 큽니다.
P4 StdDev, Average, MaxP1 레이아웃에서 세 가지 측정값을 동시에 계산합니다.
단일 패스기본 엔진이며 ParallelCalculation이 꺼져 있습니다.
스레드 1~14개MaxThreads를 지정하고 ParallelCalculation := True, ParallelThreshold := 1로 설정하므로 1,000,000행도 병렬로 실행됩니다. "모든 CPU"는 MaxThreads := 0으로, 논리 CPU당 스레드 하나이며 테스트 머신에서는 14개입니다.
엔진 메모리P1에서 로드된 데이터 위에 엔진이 추가로 할당하는 메모리입니다(QA 게이트 M1). 저장소 메모리는 로드된 데이터 자체입니다.

테스트 머신

격리된 실험실 머신이 아니라 평소의 데스크톱 부하가 있는 개발자 워크스테이션입니다. 2026년 11월 4일에 측정했습니다.

항목값
CPUIntel Core Ultra 5 245T, 35 W 데스크톱 프로세서
코어고성능 코어 6개와 효율 코어 8개, 논리 CPU 14개
메모리31.5 GB
운영 체제Windows 11 Pro 26H2 (빌드 26300)
컴파일러Delphi 13 Florence, 릴리스 빌드: 최적화 켜짐, 범위 및 오버플로 검사 꺼짐
플랫폼Win64(워밍업 1회 후 5회 실행의 중앙값)와 Win32(빠른 실행: 워밍업 1회 후 측정 1회)
sgcPivotGrid2026.11.0 Registered

이 프로세서는 고성능 코어와 효율 코어가 섞여 있으며, 각 작업자 스레드가 어디에서 실행될지는 Windows가 결정합니다. 스레드가 8개 이상이면 일부 작업이 효율 코어에서 실행됩니다. 그래서 Win64에서 1,000,000행의 P4는 실행마다 약 13 ms와 약 32 ms를 오가며, 스레드 8개에서 중앙값이 31.2 ms로 뛰어오릅니다.

Win64

워밍업 1회 후 5회 실행의 중앙값입니다. 시간 단위는 밀리초입니다.

로드와 메모리1,000,000행10,000,000행
AppendRow, 텍스트 3개, 실수 1개, 날짜 1개 열132.9 ms1,384.0 ms
Store.SetFloat, 고유 값 100,000개의 실수 열 1개8.6 ms98.3 ms
저장소 메모리(열 6개)36.0 MB576.0 MB
P1 이후 엔진 메모리, 모든 모드4.8 MB39.1 MB

재계산, 1,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스113.9 ms25.6 ms26.3 ms
병렬, 스레드 1개112.2 ms21.6 ms26.3 ms
병렬, 스레드 2개29.6 ms18.2 ms17.8 ms
병렬, 스레드 4개47.1 ms15.9 ms12.9 ms
병렬, 스레드 8개86.8 ms15.3 ms31.2 ms
병렬, 모든 CPU146.8 ms16.5 ms31.8 ms

재계산, 10,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스1121.1 ms300.2 ms216.9 ms
병렬, 스레드 1개1106.4 ms253.0 ms230.6 ms
병렬, 스레드 2개267.1 ms212.7 ms130.3 ms
병렬, 스레드 4개446.9 ms184.6 ms127.5 ms
병렬, 스레드 8개863.6 ms181.1 ms111.9 ms
병렬, 모든 CPU1473.5 ms186.4 ms105.4 ms

Win32

빠른 실행: 워밍업 1회 후 측정 1회이므로 Win64 중앙값보다 수치의 편차가 큽니다. 프로그램은 large address aware이며, 10,000,000행 저장소에 이것이 필요합니다.

로드와 메모리1,000,000행10,000,000행
AppendRow, 텍스트 3개, 실수 1개, 날짜 1개 열143.7 ms1,511.9 ms
Store.SetFloat, 고유 값 100,000개의 실수 열 1개16.8 ms183.7 ms
저장소 메모리(열 6개)36.0 MB576.0 MB
P1 이후 엔진 메모리, 모든 모드4.7 MB39.1 MB

재계산, 1,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스116.9 ms27.3 ms50.8 ms
병렬, 스레드 1개116.7 ms22.9 ms51.0 ms
병렬, 스레드 2개211.3 ms20.4 ms32.8 ms
병렬, 스레드 4개48.6 ms16.3 ms23.1 ms
병렬, 스레드 8개88.5 ms16.3 ms19.2 ms
병렬, 모든 CPU148.5 ms15.6 ms19.2 ms

재계산, 10,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스1143.6 ms286.8 ms442.6 ms
병렬, 스레드 1개1139.4 ms253.6 ms463.7 ms
병렬, 스레드 2개288.0 ms207.8 ms252.4 ms
병렬, 스레드 4개452.5 ms176.8 ms141.7 ms
병렬, 스레드 8개857.2 ms167.1 ms159.6 ms
병렬, 모든 CPU1464.4 ms172.0 ms131.9 ms

.NET x64

Delphi 프로그램과 같은 행, 레이아웃, 모드를 사용하는 벤치마크 프로그램의 .NET 포트입니다. 다른 런타임에서 실행되므로 이 수치는 별도의 표로 읽어 주세요. 워밍업 1회 후 5회 실행의 중앙값이며, 시간 단위는 밀리초입니다.

로드와 메모리1,000,000행10,000,000행
AppendRow, 텍스트 3개, 실수 1개, 날짜 1개 열75.6 ms770.4 ms
Store.SetFloat, 고유 값 100,000개의 실수 열 1개2.9 ms43.0 ms
저장소 메모리(열 6개)36.0 MB576.0 MB
P1 이후 엔진 메모리, 모든 모드4.7 MB39.1 MB

런타임: .NET 8.0.31, x64 프로세스, 릴리스 빌드, sgcPivotGrid 2026.11.0 Registered를 사용하는 net8.0 콘솔 프로그램이며, 위의 테스트 머신에서 같은 날 측정했습니다. 메모리는 전체 수집 후 GC.GetTotalMemory(true)로 측정한 실시간 관리 힙입니다.

재계산, 1,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스111.9 ms23.3 ms14.7 ms
병렬, 스레드 1개112.1 ms21.3 ms20.1 ms
병렬, 스레드 2개28.5 ms15.5 ms12.6 ms
병렬, 스레드 4개46.3 ms14.8 ms9.9 ms
병렬, 스레드 8개86.8 ms13.6 ms9.8 ms
병렬, 모든 CPU146.6 ms13.3 ms9.6 ms

재계산, 10,000,000행

모드스레드P1 SumP3 CountDistinctP4 StdDev, Average, Max
단일 패스167.6 ms275.1 ms128.0 ms
병렬, 스레드 1개176.4 ms215.0 ms175.9 ms
병렬, 스레드 2개244.2 ms159.6 ms89.9 ms
병렬, 스레드 4개428.8 ms133.7 ms56.2 ms
병렬, 스레드 8개834.0 ms151.7 ms72.6 ms
병렬, 모든 CPU1428.3 ms154.9 ms66.0 ms

.NET QA 성능 테스트는 Delphi 예산의 1.2배를 사용합니다(x64에서 P1 120 ms). 이번 실행에서 1,000,000행의 모든 게이트가 예산 이내였고, 모든 모드에서 P1 총합계가 값의 합계와 같았습니다.

.NET 벤치마크 실행

  1. sgcUI .NET 데모에서 PivotGrid\Benchmark\Benchmark.csproj를 엽니다. 자세한 내용은 해당 폴더의 README.md에 있습니다.
  2. .NET 8 SDK 이상으로 Release 구성에서 빌드하고 실행합니다. 병렬 계산 모드에는 Registered 또는 체험판 에디션이 필요합니다.
  3. 스위치는 Delphi 프로그램의 스위치와 같습니다. 실행할 때마다 dotnet-<arch>.md, .json, .csv를 쓰며, 예를 들어 dotnet-x64.md가 만들어집니다.
dotnet run -c Release
dotnet run -c Release -- --rows=1m,10m --quick
dotnet run -c Release -- --rows=500k,2m --threads=4 --out=C:\bench

1,000,000행 QA 예산

QA 성능 그룹은 모든 빌드에서 Win64와 Win32에 대해 이 예산을 검증하며, 하나라도 초과하면 QA 실행이 실패합니다. 10,000,000행에는 예산이 없고 QA는 결과만 보고합니다.

게이트측정 대상Win64 예산Win64 측정값Win32 예산Win32 측정값
P11,000,000행 재계산, 행 필드 2개, 열 필드 1개, Sum 1개100 ms13.9 ms160 ms16.9 ms
P1PParallelCalculation을 사용한 P1, CPU당 스레드 하나100 ms6.8 ms160 ms8.5 ms
P2텍스트 3개, 실수 1개, 날짜 값 1개로 이루어진 1,000,000행의 AppendRow, 인코딩 포함900 ms132.9 ms1,400 ms143.7 ms
P3고유 값이 100,000개인 열에 CountDistinct를 적용한 P1 레이아웃400 ms25.6 ms600 ms27.3 ms
P4StdDev, Average, Max를 적용한 P1 레이아웃180 ms26.3 ms280 ms50.8 ms
M1P1에서 저장소 위의 엔진 메모리32 MB4.8 MB32 MB4.7 MB
M1PParallelCalculation을 사용한 M1, CPU당 스레드 하나32 MB4.8 MB32 MB4.7 MB

예산은 느린 빌드 머신에서도 성능 저하를 잡아내도록 일부러 넉넉하게 잡았습니다. 테스트 머신에서 측정값은 예산보다 5.5배에서 22배 낮습니다.

병렬 계산

표의 병렬 행이 추가하는 것과 사용할 스레드 수입니다. Registered

ParallelCalculation := True는 큰 재계산을 131,072행 단위의 고정 청크로 나누어 작업자 스레드에서 계산하고, 청크 순서대로 병합합니다. MaxThreads는 작업자 수를 제한하며(0은 CPU당 하나, 최대 64), 기본값이 1,000,000행인 ParallelThreshold는 그보다 작은 저장소를 단일 패스로 유지합니다. Sum, Average, Product, StdDev 계열은 마지막 비트에서 단일 패스와 달라질 수 있으므로 기본값은 꺼짐입니다. Registered 및 체험판 에디션에 포함됩니다.

  • MaxThreads는 4에서 8을 사용하세요. 테스트 머신의 Win64에서는 두 크기 모두 스레드 4개에서 P1이 가장 좋았습니다. 1,000,000행에서 7.1 ms, 10,000,000행에서 46.9 ms이며, 단일 패스는 각각 13.9 ms와 121.1 ms입니다.
  • 스레드가 많다고 항상 빠른 것은 아닙니다. 1,000,000행은 청크가 8개뿐이어서 스레드 시작과 병합 비용이 절약되는 작업량보다 더 크게 작용합니다. 10,000,000행에서 P1은 스레드 14개에서 73.5 ms, 스레드 4개에서 46.9 ms가 걸리는데, 순서가 있는 병합이 직렬로 실행되기 때문입니다.
  • 무거운 측정값일수록 더 멀리 확장됩니다. Win64에서 10,000,000행의 P4는 스레드 14개까지 계속 개선되어 단일 패스의 216.9 ms에 비해 105.4 ms가 됩니다.
  • CountDistinct는 이득이 가장 적습니다. 고유 값 계수가 직렬로 실행되므로 P3는 최대 약 1.6배 빨라집니다.

벤치마크를 직접 실행하기

같은 프로그램, 같은 행, 같은 레이아웃을 직접 하드웨어에서 실행합니다.

  1. sgcUI 데모에서 Demos\PivotGrid\Delphi\Benchmark\sgcPivotGridBenchmark.dpr을 엽니다. 자세한 내용은 해당 폴더의 README.txt에 있습니다.
  2. 최적화를 켜고 범위 및 오버플로 검사를 끈 릴리스 빌드로 Win64 또는 Win32용으로 빌드합니다. 병렬 계산 모드에는 Registered 또는 체험판 에디션이 필요합니다.
  3. 콘솔에서 실행합니다. 기본값은 1,000,000행과 10,000,000행, 스레드 수 1, 2, 4, 8, 모든 CPU입니다.
sgcPivotGridBenchmark [--rows=1m,10m] [--threads=1,2,4,8,0] [--out=folder] [--quick]

sgcPivotGridBenchmark
sgcPivotGridBenchmark --rows=1m,10m --quick
sgcPivotGridBenchmark --rows=500k,2m --threads=4 --out=C:\bench
스위치의미
--rows테스트할 행 수이며, k와 m 접미사를 사용할 수 있습니다.
--threads병렬 모드의 MaxThreads 값입니다. 0 또는 all은 CPU당 스레드 하나입니다. 단일 패스는 항상 실행됩니다.
--out출력 폴더이며, 기본값은 exe 옆의 benchmark 폴더입니다.
--quick5회 실행의 중앙값 대신 워밍업 후 측정 1회만 실행합니다.

실행할 때마다 머신, 설정, 모든 측정 시간을 담은 delphi-<platform>.md, .json, .csv를 쓰고 1,000,000행의 QA 예산을 확인합니다. BenchmarkMain.pas에 모든 로직이 들어 있으므로, 생성된 행을 직접 데이터로 바꾸고 같은 시간 측정과 보고서를 그대로 사용할 수 있습니다. 수치가 여기와 크게 다르면 알려 주세요.

이 수치는 신중하게 읽으세요

  • 머신 한 대의 결과입니다. 실제 경과 시간은 CPU(코어 수, 하이브리드 스케줄링, 터보), 메모리 속도, 머신의 다른 부하에 따라 달라집니다.
  • 데이터 모양이 중요합니다. 멤버, 고유 값, 측정값이 더 많으면 여기서 측정한 레이아웃보다 시간과 메모리가 더 많이 듭니다.
  • Win32 수치는 측정 1회의 빠른 실행에서 나왔습니다. Win64 수치는 5회의 중앙값입니다.
  • 이 페이지는 sgcPivotGrid를 다른 피벗 컴포넌트와 비교하지 않습니다. 누구나 반복할 수 있는 방법으로 sgcPivotGrid 수치만 공개합니다.

QA 예산은 Architecture 도움말 항목에도 설명되어 있습니다.

최고의 가성비: All-Access모든 eSeGeCe 제품과 프리미엄 지원이 포함되어 연 €1,059부터 이용할 수 있어요.
All-Access 가격 보기

sgcPivotGrid로 개발하세요

sgcUI 체험판을 다운로드하여 Delphi, C++ Builder 또는 .NET 애플리케이션에 sgcPivotGrid를 추가하세요.