Benchmark di sgcPivotGrid

Tempi misurati del motore di sgcPivotGrid, TsgcPivotEngine, su 1.000.000 e 10.000.000 di righe: caricamento dei dati, ricalcolo di tre layout pivot in un solo passaggio e con calcolo parallelo, e memoria che il motore aggiunge ai dati. Ogni numero proviene da un programma di benchmark nelle demo di sgcUI, quindi puoi eseguire lo stesso test sul tuo hardware.

13,9 ms
Ricalcolo di 1.000.000 di righe, Somma, un solo passaggio
121,1 ms
Ricalcolo di 10.000.000 di righe, Somma, un solo passaggio
46,9 ms
10.000.000 di righe, Somma, calcolo parallelo con 4 thread
1.384,0 ms
Caricamento di 10.000.000 di righe con AppendRow

Win64, Delphi 13, mediana di 5 esecuzioni dopo 1 esecuzione di riscaldamento, sulla macchina di prova descritta più avanti. Vai ai risultati Win64, ai risultati Win32, ai budget del QA o a come eseguire il test da solo.

Che cosa si misura

Le righe sono generate da un seme fisso, quindi ogni macchina calcola lo stesso pivot. Ogni modalità verifica che il totale generale di P1 sia uguale alla somma della colonna dei valori.

ScenarioChe cosa fa il programma
CaricamentoAppendRow di 1.000.000 o 10.000.000 di righe con 3 valori di testo, 1 numero e 1 data ciascuna. Il testo viene codificato in indici di membro man mano che arriva. Un secondo passaggio riempie una colonna numerica con 100.000 valori distinti tramite Store.SetFloat.
P1 Somma2 campi riga (50 regioni per 20 prodotti, 1.051 elementi riga con i subtotali e il totale generale) e 1 campo colonna (12 mesi), Somma di un valore. Il pivot di base.
P3 CountDistinctIl layout P1 che conta i valori distinti della colonna con 100.000 valori distinti, l'aggregazione standard più costosa.
P4 StdDev, Media, MaxTre misure contemporaneamente sul layout P1.
Un solo passaggioIl motore predefinito, con ParallelCalculation disattivato.
Da 1 a 14 threadParallelCalculation := True con MaxThreads impostato e ParallelThreshold := 1, così anche 1.000.000 di righe vengono eseguiti in parallelo. "Tutte le CPU" è MaxThreads := 0, un thread per CPU logica, 14 sulla macchina di prova.
Memoria del motoreLa memoria che il motore alloca oltre ai dati caricati per P1 (gate QA M1). La memoria dello store sono i dati caricati stessi.

Macchina di prova

Una workstation di sviluppo con il suo normale carico desktop, non una macchina da laboratorio isolata. Misurato il 4 novembre 2026.

VoceValore
CPUIntel Core Ultra 5 245T, un processore desktop da 35 W
Core6 core prestazionali e 8 core efficienti, 14 CPU logiche
Memoria31,5 GB
Sistema operativoWindows 11 Pro 26H2 (build 26300)
CompilatoreDelphi 13 Florence, build di rilascio: ottimizzazione attiva, controlli di intervallo e overflow disattivati
PiattaformeWin64 (mediana di 5 esecuzioni dopo 1 esecuzione di riscaldamento) e Win32 (esecuzione rapida: 1 esecuzione misurata dopo 1 esecuzione di riscaldamento)
sgcPivotGrid2026.11.0 Registered

Il processore combina core veloci ed efficienti, e Windows decide dove viene eseguito ogni thread di lavoro. Con 8 thread o più una parte del lavoro finisce sui core efficienti: P4 con 1.000.000 di righe su Win64 alterna allora esecuzioni di circa 13 ms e di circa 32 ms, per cui la sua mediana sale a 31,2 ms con 8 thread.

Win64

Mediana di 5 esecuzioni dopo 1 esecuzione di riscaldamento. Tempi in millisecondi.

Caricamento e memoria1.000.000 di righe10.000.000 di righe
AppendRow, 3 colonne di testo, 1 float, 1 data132,9 ms1.384,0 ms
Store.SetFloat, 1 colonna float con 100.000 valori distinti8,6 ms98,3 ms
Memoria dello store (6 colonne)36,0 MB576,0 MB
Memoria del motore dopo P1, in ogni modalità4,8 MB39,1 MB

Ricalcolo, 1.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio113,9 ms25,6 ms26,3 ms
Parallelo, 1 thread112,2 ms21,6 ms26,3 ms
Parallelo, 2 thread29,6 ms18,2 ms17,8 ms
Parallelo, 4 thread47,1 ms15,9 ms12,9 ms
Parallelo, 8 thread86,8 ms15,3 ms31,2 ms
Parallelo, tutte le CPU146,8 ms16,5 ms31,8 ms

Ricalcolo, 10.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio1121,1 ms300,2 ms216,9 ms
Parallelo, 1 thread1106,4 ms253,0 ms230,6 ms
Parallelo, 2 thread267,1 ms212,7 ms130,3 ms
Parallelo, 4 thread446,9 ms184,6 ms127,5 ms
Parallelo, 8 thread863,6 ms181,1 ms111,9 ms
Parallelo, tutte le CPU1473,5 ms186,4 ms105,4 ms

Win32

Esecuzione rapida: 1 esecuzione misurata dopo 1 esecuzione di riscaldamento, quindi questi numeri sono più rumorosi delle mediane Win64. Il programma è large address aware, cosa di cui ha bisogno lo store da 10.000.000 di righe.

Caricamento e memoria1.000.000 di righe10.000.000 di righe
AppendRow, 3 colonne di testo, 1 float, 1 data143,7 ms1.511,9 ms
Store.SetFloat, 1 colonna float con 100.000 valori distinti16,8 ms183,7 ms
Memoria dello store (6 colonne)36,0 MB576,0 MB
Memoria del motore dopo P1, in ogni modalità4,7 MB39,1 MB

Ricalcolo, 1.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio116,9 ms27,3 ms50,8 ms
Parallelo, 1 thread116,7 ms22,9 ms51,0 ms
Parallelo, 2 thread211,3 ms20,4 ms32,8 ms
Parallelo, 4 thread48,6 ms16,3 ms23,1 ms
Parallelo, 8 thread88,5 ms16,3 ms19,2 ms
Parallelo, tutte le CPU148,5 ms15,6 ms19,2 ms

Ricalcolo, 10.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio1143,6 ms286,8 ms442,6 ms
Parallelo, 1 thread1139,4 ms253,6 ms463,7 ms
Parallelo, 2 thread288,0 ms207,8 ms252,4 ms
Parallelo, 4 thread452,5 ms176,8 ms141,7 ms
Parallelo, 8 thread857,2 ms167,1 ms159,6 ms
Parallelo, tutte le CPU1464,4 ms172,0 ms131,9 ms

.NET x64

Il port .NET del programma di benchmark, con le stesse righe, gli stessi layout e le stesse modalità del programma Delphi. Gira su un altro runtime, quindi leggi questi numeri come una tabella a parte. Mediana di 5 esecuzioni dopo 1 esecuzione di riscaldamento. Tempi in millisecondi.

Caricamento e memoria1.000.000 di righe10.000.000 di righe
AppendRow, 3 colonne di testo, 1 float, 1 data75,6 ms770,4 ms
Store.SetFloat, 1 colonna float con 100.000 valori distinti2,9 ms43,0 ms
Memoria dello store (6 colonne)36,0 MB576,0 MB
Memoria del motore dopo P1, in ogni modalità4,7 MB39,1 MB

Runtime: .NET 8.0.31, processo x64, build di rilascio, un programma console net8.0 con sgcPivotGrid 2026.11.0 Registered, sulla macchina di prova qui sopra e nello stesso giorno. La memoria è l'heap gestito attivo, misurato con GC.GetTotalMemory(true) dopo una raccolta completa.

Ricalcolo, 1.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio111,9 ms23,3 ms14,7 ms
Parallelo, 1 thread112,1 ms21,3 ms20,1 ms
Parallelo, 2 thread28,5 ms15,5 ms12,6 ms
Parallelo, 4 thread46,3 ms14,8 ms9,9 ms
Parallelo, 8 thread86,8 ms13,6 ms9,8 ms
Parallelo, tutte le CPU146,6 ms13,3 ms9,6 ms

Ricalcolo, 10.000.000 di righe

ModalitàThreadP1 SommaP3 CountDistinctP4 StdDev, Media, Max
Un solo passaggio167,6 ms275,1 ms128,0 ms
Parallelo, 1 thread176,4 ms215,0 ms175,9 ms
Parallelo, 2 thread244,2 ms159,6 ms89,9 ms
Parallelo, 4 thread428,8 ms133,7 ms56,2 ms
Parallelo, 8 thread834,0 ms151,7 ms72,6 ms
Parallelo, tutte le CPU1428,3 ms154,9 ms66,0 ms

I test di prestazioni del QA .NET usano i budget Delphi moltiplicati per 1,2 (P1 120 ms su x64). Ogni gate con 1.000.000 di righe è rimasto entro il proprio budget in questa esecuzione, e il totale generale di P1 era uguale alla somma dei valori in ogni modalità.

Esegui il benchmark .NET

  1. Apri PivotGrid\Benchmark\Benchmark.csproj dalle demo .NET di sgcUI. Il README.md in quella cartella contiene i dettagli.
  2. Compilalo ed eseguilo in Release con l'SDK .NET 8 o successivo. Le modalità di calcolo parallelo richiedono l'edizione Registered o Trial.
  3. Gli switch sono quelli del programma Delphi. Ogni esecuzione scrive dotnet-<arch>.md, .json e .csv, per esempio 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

Budget del QA con 1.000.000 di righe

Il gruppo di prestazioni del QA verifica questi budget a ogni build, su Win64 e su Win32, e l'esecuzione del QA fallisce se uno viene superato. 10.000.000 di righe non hanno budget: il QA le riporta soltanto.

GateChe cosa si misuraBudget Win64Misurato Win64Budget Win32Misurato Win32
P1Ricalcolo di 1.000.000 di righe, 2 campi riga, 1 campo colonna, 1 Somma100 ms13,9 ms160 ms16,9 ms
P1PP1 con ParallelCalculation, un thread per CPU100 ms6,8 ms160 ms8,5 ms
P2AppendRow di 1.000.000 di righe con 3 valori di testo, 1 float e 1 data, codifica inclusa900 ms132,9 ms1.400 ms143,7 ms
P3Il layout P1 con CountDistinct su una colonna con 100.000 valori distinti400 ms25,6 ms600 ms27,3 ms
P4Il layout P1 con StdDev, Media e Max180 ms26,3 ms280 ms50,8 ms
M1Memoria del motore oltre lo store per P132 MB4,8 MB32 MB4,7 MB
M1PM1 con ParallelCalculation, un thread per CPU32 MB4,8 MB32 MB4,7 MB

I budget sono volutamente larghi, così intercettano le regressioni su macchine di build lente. Sulla macchina di prova i valori misurati sono da 5,5 a 22 volte inferiori.

Calcolo parallelo

Che cosa aggiungono le righe parallele delle tabelle e quanti thread usare. Registered

ParallelCalculation := True divide un ricalcolo di grandi dimensioni in blocchi fissi di 131.072 righe, calcola i blocchi su thread di lavoro e li unisce nell'ordine dei blocchi. MaxThreads limita i thread di lavoro (0 è uno per CPU, al massimo 64), e ParallelThreshold, 1.000.000 di righe per impostazione predefinita, mantiene gli store più piccoli sul passaggio singolo. È disattivato per impostazione predefinita, perché Somma, Media, Prodotto e la famiglia StdDev possono differire dal passaggio singolo negli ultimi bit. È presente nelle edizioni Registered e Trial.

  • Usa MaxThreads da 4 a 8. Sulla macchina di prova 4 thread hanno dato il miglior P1 a entrambe le dimensioni su Win64: 7,1 ms con 1.000.000 di righe e 46,9 ms con 10.000.000 di righe, contro 13,9 ms e 121,1 ms in un solo passaggio.
  • Più thread non è sempre più veloce. 1.000.000 di righe formano solo 8 blocchi, quindi i costi di avvio dei thread e di unione pesano più del lavoro risparmiato. Con 10.000.000 di righe P1 richiede 73,5 ms con 14 thread contro 46,9 ms con 4, perché l'unione ordinata viene eseguita in serie.
  • Le misure più pesanti scalano di più. P4 con 10.000.000 di righe continua a migliorare fino a 14 thread su Win64: 105,4 ms contro 216,9 ms in un solo passaggio.
  • CountDistinct guadagna meno. Il suo conteggio dei valori distinti viene eseguito in serie, quindi P3 è al massimo circa 1,6 volte più veloce.

Esegui il benchmark da solo

Lo stesso programma, le stesse righe e gli stessi layout sul tuo hardware.

  1. Apri Demos\PivotGrid\Delphi\Benchmark\sgcPivotGridBenchmark.dpr dalle demo di sgcUI. Il README.txt in quella cartella contiene i dettagli.
  2. Compilalo come build di rilascio per Win64 o Win32, con ottimizzazione attiva e controlli di intervallo e overflow disattivati. Le modalità di calcolo parallelo richiedono l'edizione Registered o Trial.
  3. Eseguilo da una console. I valori predefiniti sono 1.000.000 e 10.000.000 di righe e i numeri di thread 1, 2, 4, 8 e tutte le 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
SwitchSignificato
--rowsNumeri di righe da provare, con i suffissi k e m.
--threadsValori di MaxThreads per le modalità parallele. 0 o all è un thread per CPU. Il passaggio singolo viene sempre eseguito.
--outCartella di output, per impostazione predefinita una cartella benchmark accanto all'exe.
--quick1 esecuzione misurata dopo il riscaldamento invece della mediana di 5.

Ogni esecuzione scrive delphi-<platform>.md, .json e .csv con la macchina, le impostazioni e ogni tempo, e verifica i budget del QA con 1.000.000 di righe. BenchmarkMain.pas contiene tutta la logica, quindi puoi sostituire le righe generate con i tuoi dati e mantenere gli stessi tempi e rapporti. Se i tuoi numeri differiscono molto da questi, scrivici.

Leggi questi numeri con attenzione

  • Una sola macchina. I tempi reali cambiano con la CPU (numero di core, scheduling ibrido, turbo), la velocità della memoria e l'altro carico sulla macchina.
  • La forma dei dati conta: più membri, più valori distinti o più misure costano più tempo e memoria dei layout misurati qui.
  • I numeri Win32 provengono da un'esecuzione rapida con 1 esecuzione misurata. I numeri Win64 sono mediane di 5.
  • Questa pagina non confronta sgcPivotGrid con altri componenti pivot. Pubblica solo numeri di sgcPivotGrid, con un metodo che chiunque può ripetere.

I budget del QA sono documentati anche nell'argomento della guida Architecture.

La scelta più conveniente: All-AccessTutti i prodotti eSeGeCe, con Supporto Premium incluso, a partire da €1,059/anno.
Vedi i prezzi All-Access

Crea con sgcPivotGrid

Scarica la versione di prova di sgcUI e aggiungi sgcPivotGrid alla tua applicazione Delphi, C++ Builder o .NET.