Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DNM: Decimal error measurements and benchmarks #7772

Closed
wants to merge 6 commits into from

Conversation

aaronc
Copy link
Member

@aaronc aaronc commented Nov 2, 2020

ref #7640


Before we can merge this PR, please make sure that all the following items have been
checked off. If any of the checklist items are not applicable, please leave them but
write a little note why.

  • Targeted PR against correct branch (see CONTRIBUTING.md)
  • Linked to Github issue with discussion and accepted design OR link to spec that describes this work.
  • Code follows the module structure standards.
  • Wrote unit and integration tests
  • Updated relevant documentation (docs/) or specification (x/<module>/spec/)
  • Added relevant godoc comments.
  • Added a relevant changelog entry to the Unreleased section in CHANGELOG.md
  • Re-reviewed Files changed in the Github PR explorer
  • Review Codecov Report in the comment section below once CI passes

@codecov
Copy link

codecov bot commented Nov 2, 2020

Codecov Report

Merging #7772 (058ba37) into master (bd6c16b) will increase coverage by 7.26%.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #7772      +/-   ##
==========================================
+ Coverage   54.31%   61.57%   +7.26%     
==========================================
  Files         610      601       -9     
  Lines       38621    34445    -4176     
==========================================
+ Hits        20976    21210     +234     
+ Misses      15508    11052    -4456     
- Partials     2137     2183      +46     
Impacted Files Coverage Δ
version/version.go 70.83% <0.00%> (-29.17%) ⬇️
...ht-clients/06-solomachine/types/proposal_handle.go 86.20% <0.00%> (-13.80%) ⬇️
x/ibc/core/04-channel/types/genesis.go 89.09% <0.00%> (-10.91%) ⬇️
client/grpc_query.go 38.70% <0.00%> (-5.74%) ⬇️
x/ibc/applications/transfer/types/trace.go 80.88% <0.00%> (-5.28%) ⬇️
x/ibc/core/02-client/keeper/keeper.go 85.03% <0.00%> (-5.26%) ⬇️
x/ibc/core/02-client/keeper/client.go 95.41% <0.00%> (-4.59%) ⬇️
types/coin.go 90.66% <0.00%> (-3.30%) ⬇️
x/capability/keeper/keeper.go 77.43% <0.00%> (-2.99%) ⬇️
baseapp/options.go 63.88% <0.00%> (-2.78%) ⬇️
... and 125 more

@aaronc
Copy link
Member Author

aaronc commented Nov 2, 2020

BenchmarkDecErr/big.Rat_(x/y)*y
    dec_err_test.go:282: big.Rat (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x/y)*y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x/y)*y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x/y)*y Out of 1000000 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/big.Rat_(x/y)*y-16         	 1000000	      1035 ns/op
BenchmarkDecErr/big.Rat_(x*y)/y
    dec_err_test.go:282: big.Rat (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x*y)/y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x*y)/y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x*y)/y Out of 1000000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: big.Rat (x*y)/y Out of 1421065 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/big.Rat_(x*y)/y-16         	 1421065	       852 ns/op
BenchmarkDecErr/sdk.Dec_(x/y)*y
    dec_err_test.go:282: sdk.Dec (x/y)*y Out of 1 trials: 0.00% Correct, 9.82e-20 Average Error
    dec_err_test.go:282: sdk.Dec (x/y)*y Out of 100 trials: 0.00% Correct, 1.22e-18 Average Error
    dec_err_test.go:282: sdk.Dec (x/y)*y Out of 10000 trials: 0.00% Correct, 2.14e-18 Average Error
    dec_err_test.go:282: sdk.Dec (x/y)*y Out of 1000000 trials: 0.00% Correct, 4.21e-18 Average Error
BenchmarkDecErr/sdk.Dec_(x/y)*y-16         	 1000000	      1103 ns/op
BenchmarkDecErr/sdk.Dec_(x*y)/y
    dec_err_test.go:282: sdk.Dec (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: sdk.Dec (x*y)/y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: sdk.Dec (x*y)/y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: sdk.Dec (x*y)/y Out of 1000000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: sdk.Dec (x*y)/y Out of 1220744 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/sdk.Dec_(x*y)/y-16         	 1220744	       988 ns/op
BenchmarkDecErr/float32_(x/y)*y
    dec_err_test.go:282: float32 (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float32 (x/y)*y Out of 100 trials: 88.00% Correct, 8.33e-09 Average Error
    dec_err_test.go:282: float32 (x/y)*y Out of 10000 trials: 88.83% Correct, 7.76e-09 Average Error
    dec_err_test.go:282: float32 (x/y)*y Out of 1000000 trials: 88.68% Correct, 7.91e-09 Average Error
    dec_err_test.go:282: float32 (x/y)*y Out of 11187768 trials: 88.63% Correct, 7.94e-09 Average Error
BenchmarkDecErr/float32_(x/y)*y-16         	11187768	       112 ns/op
BenchmarkDecErr/float32_(x*y)/y
    dec_err_test.go:282: float32 (x*y)/y Out of 1 trials: 0.00% Correct, 6.31e-08 Average Error
    dec_err_test.go:282: float32 (x*y)/y Out of 100 trials: 86.00% Correct, 9.84e-09 Average Error
    dec_err_test.go:282: float32 (x*y)/y Out of 10000 trials: 88.53% Correct, 8.22e-09 Average Error
    dec_err_test.go:282: float32 (x*y)/y Out of 1000000 trials: 88.58% Correct, 8.15e-09 Average Error
    dec_err_test.go:282: float32 (x*y)/y Out of 10673892 trials: 88.64% Correct, 8.11e-09 Average Error
BenchmarkDecErr/float32_(x*y)/y-16         	10673892	       114 ns/op
BenchmarkDecErr/float64_(x/y)*y
    dec_err_test.go:282: float64 (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float64 (x/y)*y Out of 100 trials: 92.00% Correct, 1.03e-17 Average Error
    dec_err_test.go:282: float64 (x/y)*y Out of 10000 trials: 88.81% Correct, 1.45e-17 Average Error
    dec_err_test.go:282: float64 (x/y)*y Out of 1000000 trials: 88.56% Correct, 1.49e-17 Average Error
    dec_err_test.go:282: float64 (x/y)*y Out of 10678150 trials: 88.63% Correct, 1.48e-17 Average Error
BenchmarkDecErr/float64_(x/y)*y-16         	10678150	       112 ns/op
BenchmarkDecErr/float64_(x*y)/y
    dec_err_test.go:282: float64 (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float64 (x*y)/y Out of 100 trials: 82.00% Correct, 2.46e-17 Average Error
    dec_err_test.go:282: float64 (x*y)/y Out of 10000 trials: 87.87% Correct, 1.61e-17 Average Error
    dec_err_test.go:282: float64 (x*y)/y Out of 1000000 trials: 88.33% Correct, 1.56e-17 Average Error
    dec_err_test.go:282: float64 (x*y)/y Out of 8756400 trials: 88.34% Correct, 1.56e-17 Average Error
BenchmarkDecErr/float64_(x*y)/y-16         	 8756400	       121 ns/op
BenchmarkDecErr/float128_(x/y)*y
    dec_err_test.go:282: float128 (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x/y)*y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x/y)*y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x/y)*y Out of 1000000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x/y)*y Out of 3483309 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/float128_(x/y)*y-16        	 3483309	       352 ns/op
BenchmarkDecErr/float128_(x*y)/y
    dec_err_test.go:282: float128 (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x*y)/y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x*y)/y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x*y)/y Out of 1000000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: float128 (x*y)/y Out of 3329460 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/float128_(x*y)/y-16        	 3329460	       364 ns/op
BenchmarkDecErr/decimal32_(x/y)*y
    dec_err_test.go:282: decimal32 (x/y)*y Out of 1 trials: 0.00% Correct, 1.35e-06 Average Error
    dec_err_test.go:282: decimal32 (x/y)*y Out of 100 trials: 2.00% Correct, 1.61e-06 Average Error
    dec_err_test.go:282: decimal32 (x/y)*y Out of 10000 trials: 1.08% Correct, 1.62e-06 Average Error
    dec_err_test.go:282: decimal32 (x/y)*y Out of 447969 trials: 0.95% Correct, 1.61e-06 Average Error
BenchmarkDecErr/decimal32_(x/y)*y-16       	  447969	      2759 ns/op
BenchmarkDecErr/decimal32_(x*y)/y
    dec_err_test.go:282: decimal32 (x*y)/y Out of 1 trials: 0.00% Correct, 1.35e-06 Average Error
    dec_err_test.go:282: decimal32 (x*y)/y Out of 100 trials: 1.00% Correct, 1.71e-06 Average Error
    dec_err_test.go:282: decimal32 (x*y)/y Out of 10000 trials: 1.13% Correct, 1.64e-06 Average Error
    dec_err_test.go:282: decimal32 (x*y)/y Out of 440794 trials: 0.94% Correct, 1.62e-06 Average Error
BenchmarkDecErr/decimal32_(x*y)/y-16       	  440794	      2763 ns/op
BenchmarkDecErr/decimal64_(x/y)*y
    dec_err_test.go:282: decimal64 (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal64 (x/y)*y Out of 100 trials: 77.00% Correct, 6.55e-16 Average Error
    dec_err_test.go:282: decimal64 (x/y)*y Out of 10000 trials: 81.04% Correct, 5.57e-16 Average Error
    dec_err_test.go:282: decimal64 (x/y)*y Out of 278864 trials: 81.25% Correct, 5.37e-16 Average Error
BenchmarkDecErr/decimal64_(x/y)*y-16       	  278864	      4476 ns/op
BenchmarkDecErr/decimal64_(x*y)/y
    dec_err_test.go:282: decimal64 (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal64 (x*y)/y Out of 100 trials: 80.00% Correct, 4.44e-16 Average Error
    dec_err_test.go:282: decimal64 (x*y)/y Out of 10000 trials: 83.53% Correct, 4.29e-16 Average Error
    dec_err_test.go:282: decimal64 (x*y)/y Out of 255867 trials: 83.78% Correct, 4.19e-16 Average Error
BenchmarkDecErr/decimal64_(x*y)/y-16       	  255867	      4467 ns/op
BenchmarkDecErr/decimal128_(x/y)*y
    dec_err_test.go:282: decimal128 (x/y)*y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal128 (x/y)*y Out of 100 trials: 81.00% Correct, 4.32e-34 Average Error
    dec_err_test.go:282: decimal128 (x/y)*y Out of 10000 trials: 81.58% Correct, 5.21e-34 Average Error
    dec_err_test.go:282: decimal128 (x/y)*y Out of 140558 trials: 81.31% Correct, 5.38e-34 Average Error
BenchmarkDecErr/decimal128_(x/y)*y-16      	  140558	      8592 ns/op
BenchmarkDecErr/decimal128_(x*y)/y
    dec_err_test.go:282: decimal128 (x*y)/y Out of 1 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal128 (x*y)/y Out of 100 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal128 (x*y)/y Out of 10000 trials: 100.00% Correct, 0.00e+00 Average Error
    dec_err_test.go:282: decimal128 (x*y)/y Out of 430442 trials: 100.00% Correct, 0.00e+00 Average Error
BenchmarkDecErr/decimal128_(x*y)/y-16      	  430442	      2799 ns/op

TLDR:

  • sdk.Dec can never get (x/y)*y quite right with an error similar to a 64-bit float64 or decimal64and always gets (x*y)/y right 🤷
  • big.Rat always gets both correct and is actually marginally faster than sdk.Dec
  • the https://github.com/cockroachdb/apd data types are generally a bit slower, although reasonably accurate
  • surprisingly big.Float configured as a float128 always gets this right and is actually quite fast... there must be some hardware optimization happening there 🤔

@alexanderbez
Copy link
Contributor

I don't like our decimal implementation one bit. There is an issue floating around somewhere where we propose to perform arithmetic in arbitrary precision yielding a final result in fixed precision. Would be nice to tackle that and use a more robust decimal implementation.

@aaronc
Copy link
Member Author

aaronc commented Nov 2, 2020

Some more benchmarks on specific operations (+, -, *, /). Basically this generates some random floating point numbers and performs the operation (Add for example) 1, 32, or 256 times. This is to see if some operations scale poorly. Everything seems to scale linearly, except big.Rat which is more or less expected based on previous experience. Basically performing Quo once on random numbers with big.Rat takes 588ns. Performing Quo 256 times in a row takes 3534780ns, or 13807ns/op. That's 23 times worse performance... and I imagine it keeps getting worse because the numerator and denominators get progressively more complex.

apd's Quo performs pretty poorly in general but scales linearly (as expected). I opened an issue: cockroachdb/apd#98. Add, Sub, and Mul perform fine.

big.Float seems like a pretty good option to be honest and has good accuracy. Some concerns were raised around non-determinism (#7773 (comment)), but I'm not sure it's really an issue (#7773 (comment)).

Benchmark/1_Ops:_float64.+
Benchmark/1_Ops:_float64.+-16         	59770537	        23.8 ns/op
Benchmark/1_Ops:_float64.-
Benchmark/1_Ops:_float64.--16         	73426497	        22.6 ns/op
Benchmark/1_Ops:_float64.*
Benchmark/1_Ops:_float64.*-16         	70310562	        17.4 ns/op
Benchmark/1_Ops:_float64./
Benchmark/1_Ops:_float64./-16         	61349002	        17.8 ns/op
Benchmark/1_Ops:_sdk.Dec.Add
Benchmark/1_Ops:_sdk.Dec.Add-16       	 9727219	       126 ns/op
Benchmark/1_Ops:_sdk.Dec.Sub
Benchmark/1_Ops:_sdk.Dec.Sub-16       	 8639280	       149 ns/op
Benchmark/1_Ops:_sdk.Dec.Mul
Benchmark/1_Ops:_sdk.Dec.Mul-16       	 2114596	       554 ns/op
Benchmark/1_Ops:_sdk.Dec.Quo
Benchmark/1_Ops:_sdk.Dec.Quo-16       	 2152909	       551 ns/op
Benchmark/1_Ops:_big.Rat.Add
Benchmark/1_Ops:_big.Rat.Add-16       	 2830363	       387 ns/op
Benchmark/1_Ops:_big.Rat.Sub
Benchmark/1_Ops:_big.Rat.Sub-16       	 3035028	       398 ns/op
Benchmark/1_Ops:_big.Rat.Mul
Benchmark/1_Ops:_big.Rat.Mul-16       	 3412070	       352 ns/op
Benchmark/1_Ops:_big.Rat.Quo
Benchmark/1_Ops:_big.Rat.Quo-16       	 1991086	       588 ns/op
Benchmark/1_Ops:_big.Float128.Add
Benchmark/1_Ops:_big.Float128.Add-16  	10794660	       119 ns/op
Benchmark/1_Ops:_big.Float128.Sub
Benchmark/1_Ops:_big.Float128.Sub-16  	15108212	        94.6 ns/op
Benchmark/1_Ops:_big.Float128.Mul
Benchmark/1_Ops:_big.Float128.Mul-16  	18571471	        81.6 ns/op
Benchmark/1_Ops:_big.Float128.Quo
Benchmark/1_Ops:_big.Float128.Quo-16  	 5856916	       178 ns/op
Benchmark/1_Ops:_apd.Decimal128.Add
Benchmark/1_Ops:_apd.Decimal128.Add-16         	 5596150	       216 ns/op
Benchmark/1_Ops:_apd.Decimal128.Sub
Benchmark/1_Ops:_apd.Decimal128.Sub-16         	 5778142	       207 ns/op
Benchmark/1_Ops:_apd.Decimal128.Mul
Benchmark/1_Ops:_apd.Decimal128.Mul-16         	 8566798	       144 ns/op
Benchmark/1_Ops:_apd.Decimal128.Quo
Benchmark/1_Ops:_apd.Decimal128.Quo-16         	  164010	      7844 ns/op
Benchmark/32_Ops:_float64.+
Benchmark/32_Ops:_float64.+-16                 	 2165016	       567 ns/op
Benchmark/32_Ops:_float64.-
Benchmark/32_Ops:_float64.--16                 	 2183498	       514 ns/op
Benchmark/32_Ops:_float64.*
Benchmark/32_Ops:_float64.*-16                 	 2184067	       559 ns/op
Benchmark/32_Ops:_float64./
Benchmark/32_Ops:_float64./-16                 	 2093233	       555 ns/op
Benchmark/32_Ops:_sdk.Dec.Add
Benchmark/32_Ops:_sdk.Dec.Add-16               	  431032	      3574 ns/op
Benchmark/32_Ops:_sdk.Dec.Sub
Benchmark/32_Ops:_sdk.Dec.Sub-16               	  479953	      3500 ns/op
Benchmark/32_Ops:_sdk.Dec.Mul
Benchmark/32_Ops:_sdk.Dec.Mul-16               	  306332	      4411 ns/op
Benchmark/32_Ops:_sdk.Dec.Quo
Benchmark/32_Ops:_sdk.Dec.Quo-16               	  301032	      4435 ns/op
Benchmark/32_Ops:_big.Rat.Add
Benchmark/32_Ops:_big.Rat.Add-16               	   84939	     14328 ns/op
Benchmark/32_Ops:_big.Rat.Sub
Benchmark/32_Ops:_big.Rat.Sub-16               	   82579	     15214 ns/op
Benchmark/32_Ops:_big.Rat.Mul
Benchmark/32_Ops:_big.Rat.Mul-16               	   20941	     55265 ns/op
Benchmark/32_Ops:_big.Rat.Quo
Benchmark/32_Ops:_big.Rat.Quo-16               	   16898	     69619 ns/op
Benchmark/32_Ops:_big.Float128.Add
Benchmark/32_Ops:_big.Float128.Add-16          	  514296	      2324 ns/op
Benchmark/32_Ops:_big.Float128.Sub
Benchmark/32_Ops:_big.Float128.Sub-16          	  506338	      2345 ns/op
Benchmark/32_Ops:_big.Float128.Mul
Benchmark/32_Ops:_big.Float128.Mul-16          	  762732	      1663 ns/op
Benchmark/32_Ops:_big.Float128.Quo
Benchmark/32_Ops:_big.Float128.Quo-16          	  278794	      4322 ns/op
Benchmark/32_Ops:_apd.Decimal128.Add
Benchmark/32_Ops:_apd.Decimal128.Add-16        	  247210	      5053 ns/op
Benchmark/32_Ops:_apd.Decimal128.Sub
Benchmark/32_Ops:_apd.Decimal128.Sub-16        	  255108	      5046 ns/op
Benchmark/32_Ops:_apd.Decimal128.Mul
Benchmark/32_Ops:_apd.Decimal128.Mul-16        	   90858	     13283 ns/op
Benchmark/32_Ops:_apd.Decimal128.Quo
Benchmark/32_Ops:_apd.Decimal128.Quo-16        	    4815	    253299 ns/op
Benchmark/256_Ops:_float64.+
Benchmark/256_Ops:_float64.+-16                	  298694	      4164 ns/op
Benchmark/256_Ops:_float64.-
Benchmark/256_Ops:_float64.--16                	  287742	      4226 ns/op
Benchmark/256_Ops:_float64.*
Benchmark/256_Ops:_float64.*-16                	  275848	      4443 ns/op
Benchmark/256_Ops:_float64./
Benchmark/256_Ops:_float64./-16                	  436501	      2327 ns/op
Benchmark/256_Ops:_sdk.Dec.Add
Benchmark/256_Ops:_sdk.Dec.Add-16              	   43762	     27303 ns/op
Benchmark/256_Ops:_sdk.Dec.Sub
Benchmark/256_Ops:_sdk.Dec.Sub-16              	   45858	     26985 ns/op
Benchmark/256_Ops:_sdk.Dec.Mul
Benchmark/256_Ops:_sdk.Dec.Mul-16              	   42624	     23729 ns/op
Benchmark/256_Ops:_sdk.Dec.Quo
Benchmark/256_Ops:_sdk.Dec.Quo-16              	   49270	     26507 ns/op
Benchmark/256_Ops:_big.Rat.Add
Benchmark/256_Ops:_big.Rat.Add-16              	   10000	    118178 ns/op
Benchmark/256_Ops:_big.Rat.Sub
Benchmark/256_Ops:_big.Rat.Sub-16              	   10000	    118256 ns/op
Benchmark/256_Ops:_big.Rat.Mul
Benchmark/256_Ops:_big.Rat.Mul-16              	     343	   3619302 ns/op
Benchmark/256_Ops:_big.Rat.Quo
Benchmark/256_Ops:_big.Rat.Quo-16              	     332	   3534780 ns/op
Benchmark/256_Ops:_big.Float128.Add
Benchmark/256_Ops:_big.Float128.Add-16         	   67485	     17555 ns/op
Benchmark/256_Ops:_big.Float128.Sub
Benchmark/256_Ops:_big.Float128.Sub-16         	   70546	     16691 ns/op
Benchmark/256_Ops:_big.Float128.Mul
Benchmark/256_Ops:_big.Float128.Mul-16         	   91430	     12974 ns/op
Benchmark/256_Ops:_big.Float128.Quo
Benchmark/256_Ops:_big.Float128.Quo-16         	   35420	     33573 ns/op
Benchmark/256_Ops:_apd.Decimal128.Add
Benchmark/256_Ops:_apd.Decimal128.Add-16       	   29620	     40082 ns/op
Benchmark/256_Ops:_apd.Decimal128.Sub
Benchmark/256_Ops:_apd.Decimal128.Sub-16       	   31455	     38832 ns/op
Benchmark/256_Ops:_apd.Decimal128.Mul
Benchmark/256_Ops:_apd.Decimal128.Mul-16       	   10000	    106861 ns/op
Benchmark/256_Ops:_apd.Decimal128.Quo
Benchmark/256_Ops:_apd.Decimal128.Quo-16       	     595	   1994941 ns/op

@github-actions
Copy link
Contributor

github-actions bot commented Jan 8, 2021

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@github-actions github-actions bot added the stale label Jan 8, 2021
@github-actions github-actions bot closed this Jan 14, 2021
@tac0turtle tac0turtle deleted the aaronc/dec-error-tests branch March 25, 2022 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants