Benchmarks do sgcPivotGrid

Tempos medidos do motor do sgcPivotGrid, TsgcPivotEngine, com 1.000.000 e 10.000.000 de linhas: a carga dos dados, o recálculo de três layouts de pivot em uma única passagem e com cálculo paralelo, e a memória que o motor acrescenta aos dados. Cada número vem de um programa de benchmark dos demos do sgcUI, e você pode executar o mesmo teste no seu próprio hardware.

13,9 ms
Recalcular 1.000.000 de linhas, Sum, uma única passagem
121,1 ms
Recalcular 10.000.000 de linhas, Sum, uma única passagem
46,9 ms
10.000.000 de linhas, Sum, cálculo paralelo com 4 threads
1.384,0 ms
Carregar 10.000.000 de linhas com AppendRow

Win64, Delphi 13, mediana de 5 execuções após 1 execução de aquecimento, na máquina de teste descrita abaixo. Vá para os resultados Win64, os resultados Win32, os orçamentos do QA ou como executar o teste você mesmo.

O que é medido

As linhas são geradas a partir de uma semente fixa, de modo que todas as máquinas calculam o mesmo pivot. Cada modo verifica que o total geral de P1 é igual à soma da coluna de valores.

CenárioO que o programa faz
CargaAppendRow de 1.000.000 ou 10.000.000 de linhas, cada uma com 3 valores de texto, 1 número e 1 data. O texto é codificado em índices de membros à medida que chega. Uma segunda etapa preenche uma coluna numérica com 100.000 valores distintos por meio de Store.SetFloat.
P1 Sum2 campos de linha (50 regiões por 20 produtos, 1.051 itens de linha com os subtotais e o total geral) e 1 campo de coluna (12 meses), Sum de um valor. O pivot básico.
P3 CountDistinctO layout P1 contando os valores distintos da coluna com 100.000 valores distintos, o agregado padrão mais caro.
P4 StdDev, Average, MaxTrês medidas ao mesmo tempo no layout P1.
Passagem únicaO motor padrão, com ParallelCalculation desativado.
1 a 14 threadsParallelCalculation := True com MaxThreads definido e ParallelThreshold := 1, de modo que 1.000.000 de linhas também são executadas em paralelo. "Todas as CPUs" é MaxThreads := 0, uma thread por CPU lógica, 14 na máquina de teste.
Memória do motorA memória que o motor aloca além dos dados carregados para P1 (gate M1 do QA). A memória do store são os próprios dados carregados.

Máquina de teste

Uma estação de trabalho de desenvolvedor com a sua carga normal de desktop, não uma máquina de laboratório isolada. Medido em 4 de novembro de 2026.

ItemValor
CPUIntel Core Ultra 5 245T, um processador de desktop de 35 W
Núcleos6 núcleos de desempenho e 8 núcleos eficientes, 14 CPUs lógicas
Memória31,5 GB
Sistema operacionalWindows 11 Pro 26H2 (build 26300)
CompiladorDelphi 13 Florence, build de release: otimização ativada, verificações de intervalo e de overflow desativadas
PlataformasWin64 (mediana de 5 execuções após 1 execução de aquecimento) e Win32 (execução rápida: 1 execução cronometrada após 1 execução de aquecimento)
sgcPivotGrid2026.11.0 Registrada

O processador mistura núcleos rápidos e eficientes, e o Windows decide onde cada thread de trabalho é executada. Com 8 threads ou mais, parte do trabalho vai para os núcleos eficientes: P4 com 1.000.000 de linhas em Win64 alterna então entre execuções de cerca de 13 ms e de cerca de 32 ms, e por isso a sua mediana salta para 31,2 ms com 8 threads.

Win64

Mediana de 5 execuções após 1 execução de aquecimento. Tempos em milissegundos.

Carga e memória1.000.000 de linhas10.000.000 de linhas
AppendRow, colunas de 3 textos, 1 float e 1 data132,9 ms1.384,0 ms
Store.SetFloat, 1 coluna float com 100.000 valores distintos8,6 ms98,3 ms
Memória do store (6 colunas)36,0 MB576,0 MB
Memória do motor após P1, em todos os modos4,8 MB39,1 MB

Recálculo, 1.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única113,9 ms25,6 ms26,3 ms
Paralelo, 1 thread112,2 ms21,6 ms26,3 ms
Paralelo, 2 threads29,6 ms18,2 ms17,8 ms
Paralelo, 4 threads47,1 ms15,9 ms12,9 ms
Paralelo, 8 threads86,8 ms15,3 ms31,2 ms
Paralelo, todas as CPUs146,8 ms16,5 ms31,8 ms

Recálculo, 10.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única1121,1 ms300,2 ms216,9 ms
Paralelo, 1 thread1106,4 ms253,0 ms230,6 ms
Paralelo, 2 threads267,1 ms212,7 ms130,3 ms
Paralelo, 4 threads446,9 ms184,6 ms127,5 ms
Paralelo, 8 threads863,6 ms181,1 ms111,9 ms
Paralelo, todas as CPUs1473,5 ms186,4 ms105,4 ms

Win32

Execução rápida: 1 execução cronometrada após 1 execução de aquecimento, de modo que estes números têm mais ruído do que as medianas de Win64. O programa é large address aware, o que o store de 10.000.000 de linhas exige.

Carga e memória1.000.000 de linhas10.000.000 de linhas
AppendRow, colunas de 3 textos, 1 float e 1 data143,7 ms1.511,9 ms
Store.SetFloat, 1 coluna float com 100.000 valores distintos16,8 ms183,7 ms
Memória do store (6 colunas)36,0 MB576,0 MB
Memória do motor após P1, em todos os modos4,7 MB39,1 MB

Recálculo, 1.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única116,9 ms27,3 ms50,8 ms
Paralelo, 1 thread116,7 ms22,9 ms51,0 ms
Paralelo, 2 threads211,3 ms20,4 ms32,8 ms
Paralelo, 4 threads48,6 ms16,3 ms23,1 ms
Paralelo, 8 threads88,5 ms16,3 ms19,2 ms
Paralelo, todas as CPUs148,5 ms15,6 ms19,2 ms

Recálculo, 10.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única1143,6 ms286,8 ms442,6 ms
Paralelo, 1 thread1139,4 ms253,6 ms463,7 ms
Paralelo, 2 threads288,0 ms207,8 ms252,4 ms
Paralelo, 4 threads452,5 ms176,8 ms141,7 ms
Paralelo, 8 threads857,2 ms167,1 ms159,6 ms
Paralelo, todas as CPUs1464,4 ms172,0 ms131,9 ms

.NET x64

A versão .NET do programa de benchmark, com as mesmas linhas, os mesmos layouts e os mesmos modos do programa Delphi. Ela é executada em outro runtime, portanto leia estes números como uma tabela à parte. Mediana de 5 execuções após 1 execução de aquecimento. Tempos em milissegundos.

Carga e memória1.000.000 de linhas10.000.000 de linhas
AppendRow, colunas de 3 textos, 1 float e 1 data75,6 ms770,4 ms
Store.SetFloat, 1 coluna float com 100.000 valores distintos2,9 ms43,0 ms
Memória do store (6 colunas)36,0 MB576,0 MB
Memória do motor após P1, em todos os modos4,7 MB39,1 MB

Runtime: .NET 8.0.31, processo x64, build de release, um programa de console net8.0 com o sgcPivotGrid 2026.11.0 Registrada, na máquina de teste acima e no mesmo dia. A memória é o heap gerenciado ativo, medido com GC.GetTotalMemory(true) após uma coleta completa.

Recálculo, 1.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única111,9 ms23,3 ms14,7 ms
Paralelo, 1 thread112,1 ms21,3 ms20,1 ms
Paralelo, 2 threads28,5 ms15,5 ms12,6 ms
Paralelo, 4 threads46,3 ms14,8 ms9,9 ms
Paralelo, 8 threads86,8 ms13,6 ms9,8 ms
Paralelo, todas as CPUs146,6 ms13,3 ms9,6 ms

Recálculo, 10.000.000 de linhas

ModoThreadsP1 SumP3 CountDistinctP4 StdDev, Average, Max
Passagem única167,6 ms275,1 ms128,0 ms
Paralelo, 1 thread176,4 ms215,0 ms175,9 ms
Paralelo, 2 threads244,2 ms159,6 ms89,9 ms
Paralelo, 4 threads428,8 ms133,7 ms56,2 ms
Paralelo, 8 threads834,0 ms151,7 ms72,6 ms
Paralelo, todas as CPUs1428,3 ms154,9 ms66,0 ms

Os testes de desempenho do QA do .NET usam os orçamentos do Delphi multiplicados por 1,2 (P1 120 ms em x64). Todos os gates com 1.000.000 de linhas ficaram dentro do orçamento nesta execução, e o total geral de P1 foi igual à soma dos valores em todos os modos.

Execute o benchmark .NET

  1. Abra PivotGrid\Benchmark\Benchmark.csproj a partir dos demos .NET do sgcUI. O README.md dessa pasta traz os detalhes.
  2. Compile e execute em Release com o SDK do .NET 8 ou posterior. Os modos de cálculo paralelo exigem a edição Registrada ou de Avaliação.
  3. As opções são as mesmas do programa Delphi. Cada execução grava dotnet-<arch>.md, .json e .csv, por exemplo 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

Orçamentos do QA com 1.000.000 de linhas

O grupo de desempenho do QA verifica estes orçamentos a cada build, em Win64 e em Win32, e a execução do QA falha quando um deles é excedido. 10.000.000 de linhas não têm orçamento: o QA apenas as reporta.

GateO que é medidoOrçamento Win64Medido em Win64Orçamento Win32Medido em Win32
P1Recalcular 1.000.000 de linhas, 2 campos de linha, 1 campo de coluna, 1 Sum100 ms13,9 ms160 ms16,9 ms
P1PP1 com ParallelCalculation, uma thread por CPU100 ms6,8 ms160 ms8,5 ms
P2AppendRow de 1.000.000 de linhas com 3 textos, 1 float e 1 data, codificação incluída900 ms132,9 ms1.400 ms143,7 ms
P3O layout P1 com CountDistinct em uma coluna com 100.000 valores distintos400 ms25,6 ms600 ms27,3 ms
P4O layout P1 com StdDev, Average e Max180 ms26,3 ms280 ms50,8 ms
M1Memória do motor além do store para P132 MB4,8 MB32 MB4,7 MB
M1PM1 com ParallelCalculation, uma thread por CPU32 MB4,8 MB32 MB4,7 MB

Os orçamentos são deliberadamente folgados, para que detectem regressões em máquinas de build lentas. Na máquina de teste, os valores medidos ficam entre 5,5 e 22 vezes abaixo deles.

Cálculo paralelo

O que as linhas paralelas das tabelas acrescentam e quantas threads usar. Registrada

ParallelCalculation := True divide um recálculo grande em blocos fixos de 131.072 linhas, calcula os blocos em threads de trabalho e os combina na ordem dos blocos. MaxThreads limita os threads de trabalho (0 é uma thread por CPU, no máximo 64), e ParallelThreshold, 1.000.000 de linhas por padrão, mantém os stores menores na passagem única. Vem desativado por padrão, porque Sum, Average, Product e a família StdDev podem diferir da passagem única nos últimos bits. Está nas edições Registrada e de Avaliação.

  • Use MaxThreads de 4 a 8. Na máquina de teste, 4 threads deram o melhor P1 nos dois tamanhos em Win64: 7,1 ms com 1.000.000 de linhas e 46,9 ms com 10.000.000 de linhas, contra 13,9 ms e 121,1 ms em uma única passagem.
  • Mais threads nem sempre é mais rápido. 1.000.000 de linhas formam apenas 8 blocos, então os custos de iniciar threads e de combinar pesam mais do que o trabalho economizado. Com 10.000.000 de linhas, P1 leva 73,5 ms com 14 threads contra 46,9 ms com 4, porque a combinação ordenada é executada em série.
  • Medidas mais pesadas escalam mais. P4 com 10.000.000 de linhas continua melhorando até 14 threads em Win64: 105,4 ms contra 216,9 ms em uma única passagem.
  • CountDistinct ganha menos. A contagem dos valores distintos é executada em série, de modo que P3 fica cerca de 1,6 vez mais rápido, no melhor caso.

Execute o benchmark você mesmo

O mesmo programa, as mesmas linhas e os mesmos layouts no seu próprio hardware.

  1. Abra Demos\PivotGrid\Delphi\Benchmark\sgcPivotGridBenchmark.dpr a partir dos demos do sgcUI. O README.txt dessa pasta traz os detalhes.
  2. Compile-o como build de release para Win64 ou Win32, com a otimização ativada e as verificações de intervalo e de overflow desativadas. Os modos de cálculo paralelo exigem a edição Registrada ou de Avaliação.
  3. Execute-o em um console. Os padrões são 1.000.000 e 10.000.000 de linhas e as quantidades de threads 1, 2, 4, 8 e todas as CPUs.
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
OpçãoSignificado
--rowsQuantidades de linhas a testar, com os sufixos k e m.
--threadsValores de MaxThreads para os modos paralelos. 0 ou all é uma thread por CPU. A passagem única sempre é executada.
--outPasta de saída, por padrão uma pasta benchmark ao lado do exe.
--quick1 execução cronometrada após o aquecimento, em vez da mediana de 5.

Cada execução grava delphi-<platform>.md, .json e .csv com a máquina, as configurações e cada tempo, e verifica os orçamentos do QA com 1.000.000 de linhas. BenchmarkMain.pas concentra toda a lógica, de modo que você pode trocar as linhas geradas pelos seus próprios dados e manter a mesma medição de tempo e os mesmos relatórios. Se os seus números forem muito diferentes destes, avise-nos.

Leia estes números com cuidado

  • Uma única máquina. Os tempos de relógio mudam com a CPU (número de núcleos, escalonamento híbrido, turbo), a velocidade da memória e a outra carga da máquina.
  • O formato dos dados importa: mais membros, mais valores distintos ou mais medidas custam mais tempo e memória do que os layouts medidos aqui.
  • Os números de Win32 vêm de uma execução rápida com 1 execução cronometrada. Os números de Win64 são medianas de 5.
  • Esta página não compara o sgcPivotGrid com outros componentes de pivot. Ela publica apenas números do sgcPivotGrid, com um método que qualquer pessoa pode repetir.

Os orçamentos do QA também estão documentados no tópico de ajuda Architecture.

Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Crie com o sgcPivotGrid

Baixe a avaliação do sgcUI e adicione o sgcPivotGrid à sua aplicação Delphi, C++ Builder ou .NET.