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

Optimize BigInteger.CompareTo() #96835

Merged
merged 5 commits into from
Jan 29, 2024

Conversation

kzrnm
Copy link
Contributor

@kzrnm kzrnm commented Jan 11, 2024

I optimized CompareTo() as follows.

  • Reduced number of comparison operation calls
  • Removal of bound checks
  • Shared implementation of BigInteger.CompareTo and BigIntegerCalculator.Compare

kzrnm/performance@b3d5819


BenchmarkDotNet v0.13.11-nightly.20231126.107, Windows 11 (10.0.22631.2861/23H2/2023Update/SunValley3)
13th Gen Intel Core i5-13500, 1 CPU, 20 logical and 14 physical cores
.NET SDK 9.0.100-alpha.1.24055.2
  [Host]     : .NET 9.0.0 (9.0.24.5410), X64 RyuJIT AVX2
  Job-TFLKKT : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2
  Job-RQNTME : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2

PowerPlanMode=00000000-0000-0000-0000-000000000000  IterationTime=250.0000 ms  MaxIterationCount=20  
MinIterationCount=15  WarmupCount=1  

Method Job Toolchain arguments Mean Error StdDev Median Min Max Ratio RatioSD Allocated Alloc Ratio
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffFirstByte 35.574 ns 0.1296 ns 0.1212 ns 35.565 ns 35.376 ns 35.776 ns 0.77 0.00 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffFirstByte 46.289 ns 0.1244 ns 0.1102 ns 46.276 ns 46.154 ns 46.535 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffLastByte 2.023 ns 0.0112 ns 0.0093 ns 2.022 ns 2.007 ns 2.044 ns 0.88 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffLastByte 2.285 ns 0.0137 ns 0.0122 ns 2.285 ns 2.262 ns 2.303 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffMiddleByte 14.943 ns 0.0859 ns 0.0761 ns 14.937 ns 14.853 ns 15.106 ns 0.69 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffMiddleByte 21.642 ns 0.1474 ns 0.1307 ns 21.616 ns 21.410 ns 21.916 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, Same 30.253 ns 0.1889 ns 0.1577 ns 30.253 ns 29.968 ns 30.548 ns 0.83 0.02 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, Same 36.486 ns 0.6951 ns 0.6502 ns 36.725 ns 35.299 ns 37.722 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffFirstByte 7.920 ns 0.0364 ns 0.0341 ns 7.919 ns 7.864 ns 7.978 ns 0.72 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffFirstByte 11.046 ns 0.2108 ns 0.1972 ns 10.970 ns 10.824 ns 11.488 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffLastByte 2.311 ns 0.0692 ns 0.0578 ns 2.297 ns 2.254 ns 2.455 ns 1.11 0.40 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffLastByte 3.786 ns 1.8665 ns 2.1494 ns 2.934 ns 1.729 ns 6.698 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffMiddleByte 5.747 ns 0.0471 ns 0.0418 ns 5.751 ns 5.682 ns 5.805 ns 0.87 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffMiddleByte 6.631 ns 0.0667 ns 0.0624 ns 6.611 ns 6.564 ns 6.760 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, Same 6.220 ns 0.0496 ns 0.0464 ns 6.216 ns 6.169 ns 6.308 ns 0.75 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, Same 8.307 ns 0.0794 ns 0.0743 ns 8.284 ns 8.184 ns 8.418 ns 1.00 0.00 - NA

@ghost ghost added the community-contribution Indicates that the PR has been added by a community member label Jan 11, 2024
@ghost
Copy link

ghost commented Jan 11, 2024

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

I optimized CompareTo() as follows.

  • Reduced number of comparison operation calls
  • Removal of bound checks
  • Shared implementation of BigInteger.CompareTo and BigIntegerCalculator.Compare

BenchmarkDotNet v0.13.11-nightly.20231126.107, Windows 11 (10.0.22631.2861/23H2/2023Update/SunValley3)
13th Gen Intel Core i5-13500, 1 CPU, 20 logical and 14 physical cores
.NET SDK 9.0.100-alpha.1.24055.2
  [Host]     : .NET 9.0.0 (9.0.24.5410), X64 RyuJIT AVX2
  Job-TFLKKT : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2
  Job-RQNTME : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2

PowerPlanMode=00000000-0000-0000-0000-000000000000  IterationTime=250.0000 ms  MaxIterationCount=20  
MinIterationCount=15  WarmupCount=1  

Method Job Toolchain arguments Mean Error StdDev Median Min Max Ratio RatioSD Allocated Alloc Ratio
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffFirstByte 35.574 ns 0.1296 ns 0.1212 ns 35.565 ns 35.376 ns 35.776 ns 0.77 0.00 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffFirstByte 46.289 ns 0.1244 ns 0.1102 ns 46.276 ns 46.154 ns 46.535 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffLastByte 2.023 ns 0.0112 ns 0.0093 ns 2.022 ns 2.007 ns 2.044 ns 0.88 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffLastByte 2.285 ns 0.0137 ns 0.0122 ns 2.285 ns 2.262 ns 2.303 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, DiffMiddleByte 14.943 ns 0.0859 ns 0.0761 ns 14.937 ns 14.853 ns 15.106 ns 0.69 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, DiffMiddleByte 21.642 ns 0.1474 ns 0.1307 ns 21.616 ns 21.410 ns 21.916 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 259 bytes, Same 30.253 ns 0.1889 ns 0.1577 ns 30.253 ns 29.968 ns 30.548 ns 0.83 0.02 - NA
Compare Job-RQNTME \old\corerun.exe 259 bytes, Same 36.486 ns 0.6951 ns 0.6502 ns 36.725 ns 35.299 ns 37.722 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffFirstByte 7.920 ns 0.0364 ns 0.0341 ns 7.919 ns 7.864 ns 7.978 ns 0.72 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffFirstByte 11.046 ns 0.2108 ns 0.1972 ns 10.970 ns 10.824 ns 11.488 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffLastByte 2.311 ns 0.0692 ns 0.0578 ns 2.297 ns 2.254 ns 2.455 ns 1.11 0.40 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffLastByte 3.786 ns 1.8665 ns 2.1494 ns 2.934 ns 1.729 ns 6.698 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, DiffMiddleByte 5.747 ns 0.0471 ns 0.0418 ns 5.751 ns 5.682 ns 5.805 ns 0.87 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, DiffMiddleByte 6.631 ns 0.0667 ns 0.0624 ns 6.611 ns 6.564 ns 6.760 ns 1.00 0.00 - NA
Compare Job-TFLKKT \new\corerun.exe 67 bytes, Same 6.220 ns 0.0496 ns 0.0464 ns 6.216 ns 6.169 ns 6.308 ns 0.75 0.01 - NA
Compare Job-RQNTME \old\corerun.exe 67 bytes, Same 8.307 ns 0.0794 ns 0.0743 ns 8.284 ns 8.184 ns 8.418 ns 1.00 0.00 - NA
Author: kzrnm
Assignees: -
Labels:

area-System.Numerics

Milestone: -

@tannergooding tannergooding merged commit 9bbfa9a into dotnet:main Jan 29, 2024
108 of 111 checks passed
@kzrnm kzrnm deleted the BigIntegerCalculatorCompare branch January 29, 2024 16:47
@github-actions github-actions bot locked and limited conversation to collaborators Feb 29, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.Numerics community-contribution Indicates that the PR has been added by a community member
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants