sgcPivotGrid ベンチマーク
sgcPivotGrid のエンジン TsgcPivotEngine の実測時間を、1,000,000 行と 10,000,000 行で示します。データの読み込み、3 種類のピボットレイアウトのシングルパスと並列計算での再計算、そしてデータに加えてエンジンが使用するメモリを測定しています。すべての数値は sgcUI のデモに含まれるベンチマークプログラムによるもので、お使いのハードウェアで同じテストを実行できます。
sgcPivotGrid のエンジン TsgcPivotEngine の実測時間を、1,000,000 行と 10,000,000 行で示します。データの読み込み、3 種類のピボットレイアウトのシングルパスと並列計算での再計算、そしてデータに加えてエンジンが使用するメモリを測定しています。すべての数値は sgcUI のデモに含まれるベンチマークプログラムによるもので、お使いのハードウェアで同じテストを実行できます。
AppendRow で 10,000,000 行を読み込みWin64、Delphi 13、ウォームアップ 1 回の後の 5 回の実行の中央値で、下記のテストマシンで測定しています。Win64 の結果、Win32 の結果、QA の予算値、またはご自身でテストを実行する方法へ移動できます。
行は固定のシードから生成するため、どのマシンでも同じピボットを計算します。どのモードでも、P1 の総計が値の列の合計と等しいことを確認しています。
| シナリオ | プログラムの処理 |
|---|---|
| 読み込み | テキスト値 3 つ、数値 1 つ、日付 1 つを持つ 1,000,000 行または 10,000,000 行の AppendRow。テキストは到着時にメンバーインデックスへエンコードされます。2 番目のステップでは、Store.SetFloat で数値列に 100,000 個の異なる値を設定します。 |
| P1 Sum | 行フィールド 2 つ(50 の地域と 20 の製品、小計と総計を含む 1,051 の行アイテム)と列フィールド 1 つ(12 か月)で、1 つの値の Sum を計算します。基本のピボットです。 |
| P3 CountDistinct | P1 のレイアウトで、100,000 個の異なる値を持つ列の異なる値を数えます。標準の集計の中で最も負荷が高い処理です。 |
| P4 StdDev、Average、Max | P1 のレイアウトで 3 つの測定値を同時に計算します。 |
| シングルパス | 既定のエンジンで、ParallelCalculation はオフです。 |
| 1 から 14 スレッド | MaxThreads を設定し ParallelThreshold := 1 とした ParallelCalculation := True で、1,000,000 行も並列で実行されます。「全 CPU」は MaxThreads := 0 で、論理 CPU ごとに 1 スレッドを使い、テストマシンでは 14 です。 |
| エンジンのメモリ | P1 について、読み込んだデータに加えてエンジンが確保するメモリです(QA ゲート M1)。ストアのメモリは、読み込んだデータそのものです。 |
通常のデスクトップ負荷がかかった開発用ワークステーションで、隔離されたラボのマシンではありません。2026 年 11 月 4 日に測定しました。
| 項目 | 値 |
|---|---|
| CPU | Intel Core Ultra 5 245T、35 W のデスクトッププロセッサ |
| コア | パフォーマンスコア 6 個と高効率コア 8 個、論理 CPU 14 個 |
| メモリ | 31.5 GB |
| オペレーティングシステム | Windows 11 Pro 26H2 (build 26300) |
| コンパイラ | Delphi 13 Florence、リリースビルド: 最適化オン、範囲チェックとオーバーフローチェックはオフ |
| プラットフォーム | Win64(ウォームアップ 1 回の後の 5 回の実行の中央値)と Win32(簡易実行: ウォームアップ 1 回の後に計測 1 回) |
| sgcPivotGrid | 2026.11.0 登録版 |
このプロセッサは高速コアと高効率コアが混在しており、各ワーカースレッドをどのコアで実行するかは Windows が決めます。スレッド数が 8 以上になると、一部の処理が高効率コアに割り当てられます。そのため、Win64 の 1,000,000 行の P4 は、約 13 ms と約 32 ms を実行ごとに行き来し、8 スレッドでの中央値は 31.2 ms に跳ね上がります。
ウォームアップ 1 回の後の 5 回の実行の中央値です。時間の単位はミリ秒です。
| 読み込みとメモリ | 1,000,000 行 | 10,000,000 行 |
|---|---|---|
AppendRow、テキスト 3 列、浮動小数点 1 列、日付 1 列 | 132.9 ms | 1,384.0 ms |
Store.SetFloat、100,000 個の異なる値を持つ浮動小数点 1 列 | 8.6 ms | 98.3 ms |
| ストアのメモリ(6 列) | 36.0 MB | 576.0 MB |
| P1 後のエンジンのメモリ、全モード共通 | 4.8 MB | 39.1 MB |
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 13.9 ms | 25.6 ms | 26.3 ms |
| 並列、1 スレッド | 1 | 12.2 ms | 21.6 ms | 26.3 ms |
| 並列、2 スレッド | 2 | 9.6 ms | 18.2 ms | 17.8 ms |
| 並列、4 スレッド | 4 | 7.1 ms | 15.9 ms | 12.9 ms |
| 並列、8 スレッド | 8 | 6.8 ms | 15.3 ms | 31.2 ms |
| 並列、全 CPU | 14 | 6.8 ms | 16.5 ms | 31.8 ms |
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 121.1 ms | 300.2 ms | 216.9 ms |
| 並列、1 スレッド | 1 | 106.4 ms | 253.0 ms | 230.6 ms |
| 並列、2 スレッド | 2 | 67.1 ms | 212.7 ms | 130.3 ms |
| 並列、4 スレッド | 4 | 46.9 ms | 184.6 ms | 127.5 ms |
| 並列、8 スレッド | 8 | 63.6 ms | 181.1 ms | 111.9 ms |
| 並列、全 CPU | 14 | 73.5 ms | 186.4 ms | 105.4 ms |
簡易実行: ウォームアップ 1 回の後に計測 1 回のため、Win64 の中央値よりも数値のばらつきが大きくなります。このプログラムは large address aware に対応しており、10,000,000 行のストアにはこれが必要です。
| 読み込みとメモリ | 1,000,000 行 | 10,000,000 行 |
|---|---|---|
AppendRow、テキスト 3 列、浮動小数点 1 列、日付 1 列 | 143.7 ms | 1,511.9 ms |
Store.SetFloat、100,000 個の異なる値を持つ浮動小数点 1 列 | 16.8 ms | 183.7 ms |
| ストアのメモリ(6 列) | 36.0 MB | 576.0 MB |
| P1 後のエンジンのメモリ、全モード共通 | 4.7 MB | 39.1 MB |
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 16.9 ms | 27.3 ms | 50.8 ms |
| 並列、1 スレッド | 1 | 16.7 ms | 22.9 ms | 51.0 ms |
| 並列、2 スレッド | 2 | 11.3 ms | 20.4 ms | 32.8 ms |
| 並列、4 スレッド | 4 | 8.6 ms | 16.3 ms | 23.1 ms |
| 並列、8 スレッド | 8 | 8.5 ms | 16.3 ms | 19.2 ms |
| 並列、全 CPU | 14 | 8.5 ms | 15.6 ms | 19.2 ms |
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 143.6 ms | 286.8 ms | 442.6 ms |
| 並列、1 スレッド | 1 | 139.4 ms | 253.6 ms | 463.7 ms |
| 並列、2 スレッド | 2 | 88.0 ms | 207.8 ms | 252.4 ms |
| 並列、4 スレッド | 4 | 52.5 ms | 176.8 ms | 141.7 ms |
| 並列、8 スレッド | 8 | 57.2 ms | 167.1 ms | 159.6 ms |
| 並列、全 CPU | 14 | 64.4 ms | 172.0 ms | 131.9 ms |
ベンチマークプログラムの .NET 版で、行、レイアウト、モードは Delphi 版と同じです。実行されるランタイムが異なるため、これらの数値は独立した表として読んでください。ウォームアップ 1 回の後の 5 回の実行の中央値です。時間の単位はミリ秒です。
| 読み込みとメモリ | 1,000,000 行 | 10,000,000 行 |
|---|---|---|
AppendRow、テキスト 3 列、浮動小数点 1 列、日付 1 列 | 75.6 ms | 770.4 ms |
Store.SetFloat、100,000 個の異なる値を持つ浮動小数点 1 列 | 2.9 ms | 43.0 ms |
| ストアのメモリ(6 列) | 36.0 MB | 576.0 MB |
| P1 後のエンジンのメモリ、全モード共通 | 4.7 MB | 39.1 MB |
ランタイム: .NET 8.0.31、x64 プロセス、リリースビルド、sgcPivotGrid 2026.11.0 登録版を使った net8.0 のコンソールプログラムで、上記のテストマシンを使い、同じ日に測定しました。メモリは、フルコレクションの後に GC.GetTotalMemory(true) で測定した、使用中のマネージドヒープです。
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 11.9 ms | 23.3 ms | 14.7 ms |
| 並列、1 スレッド | 1 | 12.1 ms | 21.3 ms | 20.1 ms |
| 並列、2 スレッド | 2 | 8.5 ms | 15.5 ms | 12.6 ms |
| 並列、4 スレッド | 4 | 6.3 ms | 14.8 ms | 9.9 ms |
| 並列、8 スレッド | 8 | 6.8 ms | 13.6 ms | 9.8 ms |
| 並列、全 CPU | 14 | 6.6 ms | 13.3 ms | 9.6 ms |
| モード | スレッド | P1 Sum | P3 CountDistinct | P4 StdDev、Average、Max |
|---|---|---|---|---|
| シングルパス | 1 | 67.6 ms | 275.1 ms | 128.0 ms |
| 並列、1 スレッド | 1 | 76.4 ms | 215.0 ms | 175.9 ms |
| 並列、2 スレッド | 2 | 44.2 ms | 159.6 ms | 89.9 ms |
| 並列、4 スレッド | 4 | 28.8 ms | 133.7 ms | 56.2 ms |
| 並列、8 スレッド | 8 | 34.0 ms | 151.7 ms | 72.6 ms |
| 並列、全 CPU | 14 | 28.3 ms | 154.9 ms | 66.0 ms |
.NET の QA パフォーマンステストは、Delphi の予算値の 1.2 倍を使います(x64 の P1 は 120 ms)。この実行では、1,000,000 行のすべてのゲートが予算値の範囲内に収まり、どのモードでも P1 の総計は値の合計と等しくなりました。
PivotGrid\Benchmark\Benchmark.csproj を開きます。そのフォルダーの README.md に詳細があります。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:\benchQA のパフォーマンスグループは、ビルドのたびに Win64 と Win32 でこれらの予算値を検証し、超過すると QA の実行は失敗します。10,000,000 行には予算値がなく、QA は結果の報告のみ行います。
| ゲート | 測定内容 | Win64 の予算値 | Win64 の実測値 | Win32 の予算値 | Win32 の実測値 |
|---|---|---|---|---|---|
| P1 | 1,000,000 行の再計算、行フィールド 2 つ、列フィールド 1 つ、Sum 1 つ | 100 ms | 13.9 ms | 160 ms | 16.9 ms |
| P1P | ParallelCalculation を使った P1、CPU ごとに 1 スレッド | 100 ms | 6.8 ms | 160 ms | 8.5 ms |
| P2 | テキスト 3 つ、浮動小数点 1 つ、日付 1 つの値を持つ 1,000,000 行の AppendRow、エンコードを含む | 900 ms | 132.9 ms | 1,400 ms | 143.7 ms |
| P3 | 100,000 個の異なる値を持つ列に CountDistinct を使った P1 のレイアウト | 400 ms | 25.6 ms | 600 ms | 27.3 ms |
| P4 | StdDev、Average、Max を使った P1 のレイアウト | 180 ms | 26.3 ms | 280 ms | 50.8 ms |
| M1 | P1 でストアに加えて使用するエンジンのメモリ | 32 MB | 4.8 MB | 32 MB | 4.7 MB |
| M1P | ParallelCalculation を使った M1、CPU ごとに 1 スレッド | 32 MB | 4.8 MB | 32 MB | 4.7 MB |
予算値は意図的に緩く設定しており、低速なビルドマシンでの性能低下を検出するためのものです。テストマシンでは、実測値は予算値の 5.5 分の 1 から 22 分の 1 の範囲にあります。
表の並列行が何を加えるのか、そして何スレッドを使うべきかを説明します。 登録版
ParallelCalculation := True は、大規模な再計算を 131,072 行ずつの固定サイズのチャンクに分割し、チャンクをワーカースレッドで計算して、チャンクの順にマージします。MaxThreads はワーカー数の上限を設定し(0 は CPU ごとに 1 つで、最大 64)、ParallelThreshold(既定は 1,000,000 行)より小さいストアはシングルパスのまま処理します。Sum、Average、Product、StdDev 系の集計は、シングルパスと最後の数ビットが異なる場合があるため、既定ではオフです。登録版と体験版に含まれます。
MaxThreads は 4 から 8 を使ってください。 テストマシンでは、Win64 の両方のサイズで 4 スレッドが最良の P1 でした。1,000,000 行で 7.1 ms、10,000,000 行で 46.9 ms で、シングルパスの 13.9 ms と 121.1 ms を下回ります。同じプログラム、同じ行、同じレイアウトを、お使いのハードウェアで実行します。
Demos\PivotGrid\Delphi\Benchmark\sgcPivotGridBenchmark.dpr を開きます。そのフォルダーの README.txt に詳細があります。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 ごとに 1 スレッドです。シングルパスは常に実行されます。 |
--out | 出力フォルダーです。既定は exe の隣の benchmark フォルダーです。 |
--quick | 5 回の実行の中央値の代わりに、ウォームアップの後に計測 1 回を行います。 |
実行するたびに、マシン、設定、すべての計測値を記録した delphi-<platform>.md、.json、.csv が書き出され、1,000,000 行での QA の予算値も確認されます。BenchmarkMain.pas にすべてのロジックがあるため、生成される行を独自のデータに置き換えても、同じ計測とレポートをそのまま使えます。お使いの数値がここに示した値と大きく異なる場合は、お知らせください。
QA の予算値は、アーキテクチャのヘルプトピックにも記載されています。