C# Benchmark Results

IEEE 754-2019 compliant decimal128 high-performance software solution created by Miguel.

Living document — as-measured results. Category codes, profiles, modes & method: Benchmark Key.

This is the C# view of decimal128 as-measured, band by band, with explicit ratios. It opens with the realistic financial-mix (P-fin) headline, then the per-operation band characterization (P-gen) and FMA. In C#, d128 is measured against its in-language idiom peer System.Decimal on the compact bands it can represent, and the conformant .NET 11 System.Numerics.Decimal128 (arm64 only for now). C# takes no libbid fallback, so bands neither .NET type can represent show -. It is data only — the categories, magnitude profiles, units, and methodology are defined in the Benchmark Key (and, authoritatively, BenchmarkMatrix.md). The cross-port d128 band-shape matrices (all ports, no alternatives) live in Port-Comparison Benchmark Results; the full index of per-language pages is on the Benchmarks hub.

Summary — Ratio Range by Operation

Each row below is the ratio for that reference/idiom peer on x86_64 (Intel i9-9880H): ratio = System.Decimal / Miguel or ratio = Decimal128 (.NET 11) / Miguel (> 1× ⇒ d128 faster), broken out by operation. System.Decimal has no wide-product multiply band, so that cell is blank.

  Add Subtract Multiply Divide
ratio = System.Decimal / Miguel 0.9× 0.7× — 0.6× – 5×
ratio = Decimal128 (.NET 11) / Miguel 2.2× 2.2× 2.4× – 5× 1.6× – 36×

FinMix — realistic financial mix (P-fin)

The headline: one realistic 64-bit financial operation mix — a MIX add/sub stream, mul CP/WP, div CD/WD/ET/PT — ratio = alt / Miguel (> 1 ⇒ d128 faster). This is the profile closest to real financial code.

arm64 (M3 Pro).

port op cat profile arch mode ns alt alt ns ratio run notes
csharp add MIX P-fin arm64 thru 2.78 System.Decimal 2.81 1.01× Rcs12 compact idiom peer
csharp sub MIX P-fin arm64 thru 3.21 System.Decimal 2.83 0.88× Rcs12 compact idiom peer
csharp div CD P-fin arm64 thru 22.88 System.Decimal 11.44 0.50× Rcs12 compact idiom peer
csharp div WD P-fin arm64 thru 30.73 System.Decimal 19.10 0.62× Rcs12 compact idiom peer
csharp div ET P-fin arm64 thru 4.94 System.Decimal 4.88 0.99× Rcs12 compact idiom peer
csharp div PT P-fin arm64 thru 3.69 System.Decimal 11.17 3.03× Rcs12 compact idiom peer
csharp add MIX P-fin arm64 thru 2.78 Decimal128 (.NET 11) 9.58 3.45× Rcs12  
csharp sub MIX P-fin arm64 thru 3.21 Decimal128 (.NET 11) 9.84 3.07× Rcs12  
csharp mul CP P-fin arm64 thru 1.72 Decimal128 (.NET 11) 8.78 5.10× Rcs12  
csharp mul WP P-fin arm64 thru 17.40 Decimal128 (.NET 11) 34.26 1.97× Rcs12  
csharp div CD P-fin arm64 thru 22.88 Decimal128 (.NET 11) 58.40 2.55× Rcs12  
csharp div WD P-fin arm64 thru 30.73 Decimal128 (.NET 11) 48.46 1.58× Rcs12  
csharp div ET P-fin arm64 thru 4.94 Decimal128 (.NET 11) 99.41 20.12× Rcs12  
csharp div PT P-fin arm64 thru 3.69 Decimal128 (.NET 11) 101.79 27.59× Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ns alt alt ns ratio run notes
csharp add MIX P-fin x86_64 thru 11.49 System.Decimal 11.35 0.99× xRcs11 compact idiom peer
csharp sub MIX P-fin x86_64 thru 14.98 System.Decimal 11.51 0.77× xRcs11 compact idiom peer
csharp div CD P-fin x86_64 thru 90.03 System.Decimal 59.00 0.66× xRcs11 compact idiom peer
csharp div WD P-fin x86_64 thru 104.10 System.Decimal 116.65 1.12× xRcs11 compact idiom peer
csharp div ET P-fin x86_64 thru 29.23 System.Decimal 20.69 0.71× xRcs11 compact idiom peer
csharp div PT P-fin x86_64 thru 12.00 System.Decimal 65.24 5.44× xRcs11 compact idiom peer
csharp add MIX P-fin x86_64 thru 11.49 Decimal128 (.NET 11) 26.19 2.28× xRcs11  
csharp sub MIX P-fin x86_64 thru 14.98 Decimal128 (.NET 11) 32.89 2.20× xRcs11  
csharp mul CP P-fin x86_64 thru 6.74 Decimal128 (.NET 11) 37.15 5.51× xRcs11  
csharp mul WP P-fin x86_64 thru 44.97 Decimal128 (.NET 11) 110.69 2.46× xRcs11  
csharp div CD P-fin x86_64 thru 90.03 Decimal128 (.NET 11) 213.19 2.37× xRcs11  
csharp div WD P-fin x86_64 thru 104.10 Decimal128 (.NET 11) 171.07 1.64× xRcs11  
csharp div ET P-fin x86_64 thru 29.23 Decimal128 (.NET 11) 419.91 14.37× xRcs11  
csharp div PT P-fin x86_64 thru 12.00 Decimal128 (.NET 11) 433.44 36.12× xRcs11  

Add — SQ · NQ · MQ · OQ · FQ

Swept 4096-input average per band (bare thru; ns/op = Time/4096 over the shared decimal128-resources/swept/ corpus, byte-identical operands every port). Relational peer table with explicit ratios; the cross-port d128 band-shape matrices are in Port-Comparison Benchmark Results.

arm64 (M3 Pro).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp add SQss P-gen arm64 thru 1.44 System.Decimal 3.51 2.44× Rcs12 compact idiom peer
csharp add SQos P-gen arm64 thru 2.92 System.Decimal 2.58 0.88× Rcs12 compact idiom peer
csharp add NQss P-gen arm64 thru 6.20 System.Decimal 3.77 0.61× Rcs12 compact idiom peer
csharp add NQos P-gen arm64 thru 6.98 System.Decimal 3.80 0.54× Rcs12 compact idiom peer
csharp add MQss P-gen arm64 thru 10.27 System.Decimal 3.77 0.37× Rcs12 compact idiom peer
csharp add MQos P-gen arm64 thru 15.46 System.Decimal 3.79 0.25× Rcs12 compact idiom peer
csharp add SQss P-gen arm64 thru 1.44 Decimal128 (.NET 11) 11.96 8.31× Rcs12  
csharp add SQos P-gen arm64 thru 2.92 Decimal128 (.NET 11) 12.92 4.42× Rcs12  
csharp add NQss P-gen arm64 thru 6.20 Decimal128 (.NET 11) 14.38 2.32× Rcs12  
csharp add NQos P-gen arm64 thru 6.98 Decimal128 (.NET 11) 14.76 2.11× Rcs12  
csharp add MQss P-gen arm64 thru 10.27 Decimal128 (.NET 11) 15.77 1.54× Rcs12  
csharp add MQos P-gen arm64 thru 15.46 Decimal128 (.NET 11) 15.25 0.99× Rcs12  
csharp add OQss P-gen arm64 thru 17.35 Decimal128 (.NET 11) 94.89 5.47× Rcs12  
csharp add OQos P-gen arm64 thru 25.12 Decimal128 (.NET 11) 95.25 3.79× Rcs12  
csharp add FQss P-gen arm64 thru 10.38 Decimal128 (.NET 11) 690.96 66.57× Rcs12  
csharp add FQos P-gen arm64 thru 14.92 Decimal128 (.NET 11) 709.82 47.58× Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp add SQss P-gen x86_64 thru 4.36 System.Decimal 9.48 2.17× xRcs11 compact idiom peer
csharp add SQos P-gen x86_64 thru 17.08 System.Decimal 10.46 0.61× xRcs11 compact idiom peer
csharp add NQss P-gen x86_64 thru 16.54 System.Decimal 14.36 0.87× xRcs11 compact idiom peer
csharp add NQos P-gen x86_64 thru 22.69 System.Decimal 15.89 0.70× xRcs11 compact idiom peer
csharp add MQss P-gen x86_64 thru 24.66 System.Decimal 12.17 0.49× xRcs11 compact idiom peer
csharp add MQos P-gen x86_64 thru 41.85 System.Decimal 13.12 0.31× xRcs11 compact idiom peer
csharp add SQss P-gen x86_64 thru 4.36 Decimal128 (.NET 11) 48.48 11.12× xRcs11  
csharp add SQos P-gen x86_64 thru 17.08 Decimal128 (.NET 11) 52.65 3.08× xRcs11  
csharp add NQss P-gen x86_64 thru 16.54 Decimal128 (.NET 11) 55.51 3.36× xRcs11  
csharp add NQos P-gen x86_64 thru 22.69 Decimal128 (.NET 11) 67.11 2.96× xRcs11  
csharp add MQss P-gen x86_64 thru 24.66 Decimal128 (.NET 11) 56.72 2.30× xRcs11  
csharp add MQos P-gen x86_64 thru 41.85 Decimal128 (.NET 11) 58.11 1.39× xRcs11  
csharp add OQss P-gen x86_64 thru 54.72 Decimal128 (.NET 11) 285.69 5.22× xRcs11  
csharp add OQos P-gen x86_64 thru 82.50 Decimal128 (.NET 11) 315.57 3.83× xRcs11  
csharp add FQss P-gen x86_64 thru 35.53 Decimal128 (.NET 11) 1866.16 52.52× xRcs11  
csharp add FQos P-gen x86_64 thru 51.96 Decimal128 (.NET 11) 1858.15 35.76× xRcs11  

Subtract — SQ · NQ · MQ · OQ · FQ

Swept 4096-input average per band (bare thru; ns/op = Time/4096 over the shared decimal128-resources/swept/ corpus, byte-identical operands every port). Relational peer table with explicit ratios; the cross-port d128 band-shape matrices are in Port-Comparison Benchmark Results.

arm64 (M3 Pro).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp sub SQss P-gen arm64 thru 2.27 System.Decimal 2.45 1.08× Rcs12 compact idiom peer
csharp sub SQos P-gen arm64 thru 1.68 System.Decimal 2.89 1.72× Rcs12 compact idiom peer
csharp sub NQss P-gen arm64 thru 6.31 System.Decimal 3.81 0.60× Rcs12 compact idiom peer
csharp sub NQos P-gen arm64 thru 5.17 System.Decimal 3.85 0.74× Rcs12 compact idiom peer
csharp sub MQss P-gen arm64 thru 14.38 System.Decimal 3.88 0.27× Rcs12 compact idiom peer
csharp sub MQos P-gen arm64 thru 8.59 System.Decimal 4.02 0.47× Rcs12 compact idiom peer
csharp sub SQss P-gen arm64 thru 2.27 Decimal128 (.NET 11) 13.14 5.79× Rcs12  
csharp sub SQos P-gen arm64 thru 1.68 Decimal128 (.NET 11) 11.84 7.05× Rcs12  
csharp sub NQss P-gen arm64 thru 6.31 Decimal128 (.NET 11) 14.45 2.29× Rcs12  
csharp sub NQos P-gen arm64 thru 5.17 Decimal128 (.NET 11) 14.23 2.75× Rcs12  
csharp sub MQss P-gen arm64 thru 14.38 Decimal128 (.NET 11) 15.02 1.04× Rcs12  
csharp sub MQos P-gen arm64 thru 8.59 Decimal128 (.NET 11) 15.52 1.81× Rcs12  
csharp sub OQss P-gen arm64 thru 23.37 Decimal128 (.NET 11) 94.85 4.06× Rcs12  
csharp sub OQos P-gen arm64 thru 16.48 Decimal128 (.NET 11) 94.14 5.71× Rcs12  
csharp sub FQss P-gen arm64 thru 13.44 Decimal128 (.NET 11) 710.87 52.89× Rcs12  
csharp sub FQos P-gen arm64 thru 9.18 Decimal128 (.NET 11) 699.82 76.23× Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp sub SQss P-gen x86_64 thru 11.27 System.Decimal 11.25 1.00× xRcs11 compact idiom peer
csharp sub SQos P-gen x86_64 thru 5.38 System.Decimal 9.24 1.72× xRcs11 compact idiom peer
csharp sub NQss P-gen x86_64 thru 24.02 System.Decimal 15.77 0.66× xRcs11 compact idiom peer
csharp sub NQos P-gen x86_64 thru 12.96 System.Decimal 12.04 0.93× xRcs11 compact idiom peer
csharp sub MQss P-gen x86_64 thru 40.13 System.Decimal 16.20 0.40× xRcs11 compact idiom peer
csharp sub MQos P-gen x86_64 thru 24.86 System.Decimal 13.28 0.53× xRcs11 compact idiom peer
csharp sub SQss P-gen x86_64 thru 11.27 Decimal128 (.NET 11) 53.20 4.72× xRcs11  
csharp sub SQos P-gen x86_64 thru 5.38 Decimal128 (.NET 11) 49.11 9.13× xRcs11  
csharp sub NQss P-gen x86_64 thru 24.02 Decimal128 (.NET 11) 68.45 2.85× xRcs11  
csharp sub NQos P-gen x86_64 thru 12.96 Decimal128 (.NET 11) 57.55 4.44× xRcs11  
csharp sub MQss P-gen x86_64 thru 40.13 Decimal128 (.NET 11) 61.17 1.52× xRcs11  
csharp sub MQos P-gen x86_64 thru 24.86 Decimal128 (.NET 11) 65.67 2.64× xRcs11  
csharp sub OQss P-gen x86_64 thru 76.78 Decimal128 (.NET 11) 287.51 3.74× xRcs11  
csharp sub OQos P-gen x86_64 thru 52.25 Decimal128 (.NET 11) 314.72 6.02× xRcs11  
csharp sub FQss P-gen x86_64 thru 47.91 Decimal128 (.NET 11) 1900.18 39.66× xRcs11  
csharp sub FQos P-gen x86_64 thru 35.58 Decimal128 (.NET 11) 1892.73 53.20× xRcs11  

Multiply — CP · WP · XP

Swept 4096-input average per band (bare thru; ns/op = Time/4096 over the shared decimal128-resources/swept/ corpus, byte-identical operands every port). Relational peer table with explicit ratios; the cross-port d128 band-shape matrices are in Port-Comparison Benchmark Results.

arm64 (M3 Pro).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp mul CP P-gen arm64 thru 2.15 Decimal128 (.NET 11) 8.86 4.12× Rcs12  
csharp mul WP P-gen arm64 thru 16.42 Decimal128 (.NET 11) 30.13 1.83× Rcs12  
csharp mul XP P-gen arm64 thru 43.68 Decimal128 (.NET 11) 705.88 16.16× Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp mul CP P-gen x86_64 thru 10.44 Decimal128 (.NET 11) 36.64 3.51× xRcs11  
csharp mul WP P-gen x86_64 thru 51.48 Decimal128 (.NET 11) 111.54 2.17× xRcs11  
csharp mul XP P-gen x86_64 thru 90.48 Decimal128 (.NET 11) 1812.05 20.03× xRcs11  

Divide — CD · WD · XD (+ ET · PT)

Swept 4096-input average per band (bare thru; ns/op = Time/4096 over the shared decimal128-resources/swept/ corpus, byte-identical operands every port). Relational peer table with explicit ratios; the cross-port d128 band-shape matrices are in Port-Comparison Benchmark Results.

arm64 (M3 Pro).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp div CD P-gen arm64 thru 23.76 Decimal128 (.NET 11) 53.22 2.24× Rcs12  
csharp div WD P-gen arm64 thru 30.64 Decimal128 (.NET 11) 49.30 1.61× Rcs12  
csharp div XD P-gen arm64 thru 31.84 Decimal128 (.NET 11) 108.17 3.40× Rcs12  
csharp div ET P-gen arm64 thru 6.91 Decimal128 (.NET 11) 90.94 13.16× Rcs12  
csharp div PT P-gen arm64 thru 3.54 Decimal128 (.NET 11) 88.90 25.11× Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp div CD P-gen x86_64 thru 104.45 Decimal128 (.NET 11) 214.73 2.06× xRcs11  
csharp div WD P-gen x86_64 thru 106.06 Decimal128 (.NET 11) 189.86 1.79× xRcs11  
csharp div XD P-gen x86_64 thru 125.26 Decimal128 (.NET 11) 317.10 2.53× xRcs11  
csharp div ET P-gen x86_64 thru 38.16 Decimal128 (.NET 11) 381.76 10.00× xRcs11  
csharp div PT P-gen x86_64 thru 11.77 Decimal128 (.NET 11) 385.40 32.74× xRcs11  

FMA — FN (Barrett) · FF (fits-128)

Swept 4096-input average per band (bare thru; ns/op = Time/4096 over the shared decimal128-resources/swept/ corpus, byte-identical operands every port). Relational peer table with explicit ratios; the cross-port d128 band-shape matrices are in Port-Comparison Benchmark Results.

arm64 (M3 Pro).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp fma FN FMA arm64 thru 103.04 - - - Rcs12  
csharp fma FF FMA arm64 thru 74.62 - - - Rcs12  

x86_64 (Intel i9-9880H).

port op cat profile arch mode ours alt alt ns ratio run notes
csharp fma FN FMA x86_64 thru 222.38 - - - xRcs11  
csharp fma FF FMA x86_64 thru 159.26 - - - xRcs11