sgcPivotGrid ベンチマーク

sgcPivotGrid のエンジン TsgcPivotEngine の実測時間を、1,000,000 行と 10,000,000 行で示します。データの読み込み、3 種類のピボットレイアウトのシングルパスと並列計算での再計算、そしてデータに加えてエンジンが使用するメモリを測定しています。すべての数値は 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。テキストは到着時にメンバーインデックスへエンコードされます。2 番目のステップでは、Store.SetFloat で数値列に 100,000 個の異なる値を設定します。
P1 Sum行フィールド 2 つ(50 の地域と 20 の製品、小計と総計を含む 1,051 の行アイテム)と列フィールド 1 つ(12 か月)で、1 つの値の Sum を計算します。基本のピボットです。
P3 CountDistinctP1 のレイアウトで、100,000 個の異なる値を持つ列の異なる値を数えます。標準の集計の中で最も負荷が高い処理です。
P4 StdDev、Average、MaxP1 のレイアウトで 3 つの測定値を同時に計算します。
シングルパス既定のエンジンで、ParallelCalculation はオフです。
1 から 14 スレッドMaxThreads を設定し ParallelThreshold := 1 とした ParallelCalculation := True で、1,000,000 行も並列で実行されます。「全 CPU」は MaxThreads := 0 で、論理 CPU ごとに 1 スレッドを使い、テストマシンでは 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 (build 26300)
コンパイラDelphi 13 Florence、リリースビルド: 最適化オン、範囲チェックとオーバーフローチェックはオフ
プラットフォームWin64(ウォームアップ 1 回の後の 5 回の実行の中央値)と Win32(簡易実行: ウォームアップ 1 回の後に計測 1 回)
sgcPivotGrid2026.11.0 登録版

このプロセッサは高速コアと高効率コアが混在しており、各ワーカースレッドをどのコアで実行するかは 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

ベンチマークプログラムの .NET 版で、行、レイアウト、モードは Delphi 版と同じです。実行されるランタイムが異なるため、これらの数値は独立した表として読んでください。ウォームアップ 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 登録版を使った 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 としてビルドし、実行します。並列計算のモードには、登録版または体験版が必要です。
  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 ごとに 1 スレッド100 ms6.8 ms160 ms8.5 ms
P2テキスト 3 つ、浮動小数点 1 つ、日付 1 つの値を持つ 1,000,000 行の AppendRow、エンコードを含む900 ms132.9 ms1,400 ms143.7 ms
P3100,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 ごとに 1 スレッド32 MB4.8 MB32 MB4.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 を下回ります。
  • スレッドを増やせば常に速くなるわけではありません。 1,000,000 行は 8 チャンクにしかならないため、スレッドの起動とマージのコストが、節約できる処理よりも大きくなります。10,000,000 行では、順序付きマージが直列で実行されるため、P1 は 4 スレッドの 46.9 ms に対して 14 スレッドでは 73.5 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 のリリースビルドとしてビルドします。並列計算のモードには、登録版または体験版が必要です。
  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 ごとに 1 スレッドです。シングルパスは常に実行されます。
--out出力フォルダーです。既定は exe の隣の benchmark フォルダーです。
--quick5 回の実行の中央値の代わりに、ウォームアップの後に計測 1 回を行います。

実行するたびに、マシン、設定、すべての計測値を記録した delphi-<platform>.md、.json、.csv が書き出され、1,000,000 行での QA の予算値も確認されます。BenchmarkMain.pas にすべてのロジックがあるため、生成される行を独自のデータに置き換えても、同じ計測とレポートをそのまま使えます。お使いの数値がここに示した値と大きく異なる場合は、お知らせください。

数値は注意して読んでください

  • 測定したのは 1 台のマシンです。実時間は、CPU(コア数、ハイブリッドスケジューリング、ターボ)、メモリの速度、マシン上の他の負荷によって変わります。
  • データの形も影響します。メンバー数、異なる値の数、測定値の数が多いほど、ここで測定したレイアウトよりも多くの時間とメモリがかかります。
  • Win32 の数値は、計測 1 回の簡易実行によるものです。Win64 の数値は 5 回の実行の中央値です。
  • このページは sgcPivotGrid を他のピボットコンポーネントと比較しません。誰でも繰り返せる方法で、sgcPivotGrid の数値のみを公開しています。

QA の予算値は、アーキテクチャのヘルプトピックにも記載されています。

最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

sgcPivotGrid で開発を始めましょう

sgcUI の体験版をダウンロードして、sgcPivotGrid を Delphi、C++ Builder、.NET のアプリケーションに追加できます。