Writing a decimal as numeric allocates a short[9] per value
I maintainer di solito rispondono entro 6 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 89/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- csharp, postgresql
- Ambito
- backend, databases, performance
Direzione di ricerca
Inizia con DecimalNumericConverter<T>.Write e PgNumeric.Builder.Create, citati nell’issue, poi esegui il comando BenchmarkDotNet fornito da test/Npgsql.Benchmarks. Confronta la dimensione del buffer dello stack con il limite superiore del builder per i valori decimali; il lavoro è completato quando le scritture numeriche non allocano più un short[9] per valore e il benchmark conferma la modifica delle allocazioni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Steps to reproduce
Write any non-null decimal parameter as numeric, or run the existing benchmark:
cd test/Npgsql.Benchmarks
dotnet run -c Release -- --filter '*TypeHandlers.Numeric.Write*' --job short
The issue
DecimalNumericConverter<T>.Write gives PgNumeric.Builder a stack buffer of MaxDecimalNumericDigits (8) shorts:
Span<short> destination = stackalloc short[PgNumeric.Builder.MaxDecimalNumericDigits];
PgNumeric.Builder.Create reserves an upper bound before converting, and allocates if the destination is smaller:
var bitsUpperBound = (bits.Length * (MaxUInt32Scale + 1) + MaxUInt16Scale - 1) / MaxUInt16Scale + 1;
if (bitsUpperBound > destination.Length)
destination = digitsArray = new short[bitsUpperBound];
For a decimal, bits.Length is 3, so the bound is (3 * 10 + 3) / 4 + 1 = 9. That is more than 8, so every non-null value allocates a short[9] (48 B), and the stack buffer is never used. The same converter is used for byte, short, int, long, float and double mapped to numeric, and for numeric ranges and multiranges.
A decimal never needs more than 8 numeric digits. The 9th slot is the builder's generic headroom, so the buffer is one short too small for the check.
TypeHandlers.Numeric.Write on main (b35800b4), BenchmarkDotNet ShortRun, .NET 10.0.14: all 15 benchmark values allocate 48 B per op.
This is unrelated to #6509, which is a read-side bug in PgNumeric.Builder.ToDecimal.
Further technical details
Npgsql version: main (11.0.0-preview.1, b35800b4); also present in 10.0.3
PostgreSQL version: any (client side)
Operating system: any
- Lingua principale
- C#
- Stelle
- 3.7k
- Fork
- 890
- Merge medio
- 4g 11h
- PR unite (30g)
- 19
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di npgsql/npgsql
-
Reading a large interval as TimeSpan returns a wrong value instead of throwingForse già presa @Mr444-dev l’ha presa 7 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
I maintainer di solito rispondono entro 6 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 6 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
npgsql/npgsql#6569 · 2 commenti ·
I maintainer di solito rispondono entro 6 giorni
-
ReadReplicationSlot returns the slot name as passed, not the one the server readForse già presa @Brar l’ha presa 8 giorni fa. Apertareplication
npgsql/npgsql#6735 · 1 assegnatario ·
I maintainer di solito rispondono entro 6 giorni
-
Multi-host: a host that accepts TCP but never responds is never marked offline, so every new connection waits for the full TimeoutForse già presa @mt89vein l’ha presa 7 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 22/100
I maintainer di solito rispondono entro 6 giorni
Tutte le issue di npgsql/npgsql
Issue simili
-
Issue-Bug Needs-Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
JiaFeiMiao-K-Cat/DiscImageStudio#281 ·
I maintainer di solito rispondono entro 1 giorno
-
area/access-management Frontend onboarding candidate :handshake:
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
Altinn/altinn-auth#4941 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
aws/aws-sdk-net#4586 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno