Skip to content

FSharp.Core: Set: optimize tree layout - #10190

Merged
cartermp merged 3 commits into
dotnet:mainfrom
buybackoff:core-set-layout
Sep 28, 2020
Merged

FSharp.Core: Set: optimize tree layout#10190
cartermp merged 3 commits into
dotnet:mainfrom
buybackoff:core-set-layout

Conversation

@buybackoff

Copy link
Copy Markdown
Contributor

Same changes as in #10188

Also fix tracing in Map: #if-protected tracing was not updated properly in the previous PR.

MethodJobBuildConfigurationSizeMeanErrorStdDevRankGen 0Gen 1Gen 2AllocatedCode Size
containsKeyAfterLocalBuild10030.48 ns0.319 ns0.367 ns1----177 B
containsKeyBeforeDefault10046.77 ns0.172 ns0.199 ns2----261 B
containsKeyAfterLocalBuild1000056.06 ns0.358 ns0.412 ns3----177 B
containsKeyBeforeDefault1000092.14 ns0.314 ns0.362 ns4----261 B
isSubsetOfAfterLocalBuild1001,003.26 ns7.438 ns8.565 ns10.0040--32 B80 B
isSubsetOfBeforeDefault1001,464.29 ns10.892 ns12.106 ns2---32 B80 B
isSubsetOfAfterLocalBuild10000301,895.28 ns3,344.640 ns3,851.692 ns3---34 B80 B
isSubsetOfBeforeDefault10000418,711.41 ns9,323.778 ns10,737.277 ns4---34 B80 B
maxItemAfterLocalBuild10014.99 ns0.050 ns0.058 ns10.0038--24 B218 B
maxItemBeforeDefault10031.11 ns0.067 ns0.072 ns30.0037--24 B218 B
maxItemAfterLocalBuild1000023.80 ns0.159 ns0.183 ns20.0037--24 B218 B
maxItemBeforeDefault1000052.40 ns0.135 ns0.156 ns40.0037--24 B218 B
itemCountAfterLocalBuild100200.70 ns0.847 ns0.870 ns1----96 B
itemCountBeforeDefault100419.93 ns0.937 ns1.079 ns2----138 B
itemCountAfterLocalBuild1000025,581.85 ns188.342 ns216.895 ns3----96 B
itemCountBeforeDefault1000046,754.89 ns202.769 ns225.377 ns4----138 B
iterForeachAfterLocalBuild1002,881.03 ns7.049 ns7.835 ns10.9660--6120 B280 B
iterForeachBeforeDefault1003,608.70 ns12.932 ns14.892 ns20.9644--6120 B280 B
iterForeachAfterLocalBuild10000314,901.59 ns1,778.653 ns1,976.968 ns395.0000--600128 B280 B
iterForeachBeforeDefault10000381,488.32 ns914.308 ns1,016.251 ns494.5122--600127 B280 B
addItemAfterLocalBuild100193.98 ns0.587 ns0.652 ns10.0500--317 B499 B
addItemBeforeDefault100291.34 ns1.804 ns1.931 ns20.0501--317 B542 B
addItemAfterLocalBuild1000043,575.99 ns216.915 ns249.800 ns39.21882.8125-58637 B499 B
addItemBeforeDefault1000062,096.44 ns205.697 ns228.632 ns49.16672.7083-58637 B542 B
removeItemAfterLocalBuild10012.05 ns0.055 ns0.061 ns10.0064--40 B447 B
removeItemBeforeDefault10014.71 ns0.248 ns0.285 ns20.0064--40 B500 B
removeItemAfterLocalBuild100001,183.65 ns9.752 ns11.231 ns30.6343--4000 B447 B
removeItemBeforeDefault100001,484.44 ns13.358 ns14.848 ns40.6368--4000 B500 B

@forki

Copy link
Copy Markdown
Contributor

Can you please put the map fixes into a separate PR. I assume it should be merged asap

@buybackoff

Copy link
Copy Markdown
ContributorAuthor

Can you please put the map fixes into a separate PR. I assume it should be merged asap

Done in #10191

Will update this PR soon

Same changes as in dotnet#10188
| Method | Job | BuildConfiguration | Size | Mean | Error | StdDev | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated | Code Size |
|------------ |------- |------------------- |------ |--------------:|-------------:|--------------:|-----:|--------:|-------:|------:|----------:|----------:|
| containsKey | After | LocalBuild | 100 | 30.48 ns | 0.319 ns | 0.367 ns | 1 | - | - | - | - | 177 B |
| containsKey | Before | Default | 100 | 46.77 ns | 0.172 ns | 0.199 ns | 2 | - | - | - | - | 261 B |
| containsKey | After | LocalBuild | 10000 | 56.06 ns | 0.358 ns | 0.412 ns | 3 | - | - | - | - | 177 B |
| containsKey | Before | Default | 10000 | 92.14 ns | 0.314 ns | 0.362 ns | 4 | - | - | - | - | 261 B |
| | | | | | | | | | | | | |
| isSubsetOf | After | LocalBuild | 100 | 1,003.26 ns | 7.438 ns | 8.565 ns | 1 | 0.0040 | - | - | 32 B | 80 B |
| isSubsetOf | Before | Default | 100 | 1,464.29 ns | 10.892 ns | 12.106 ns | 2 | - | - | - | 32 B | 80 B |
| isSubsetOf | After | LocalBuild | 10000 | 301,895.28 ns | 3,344.640 ns | 3,851.692 ns | 3 | - | - | - | 34 B | 80 B |
| isSubsetOf | Before | Default | 10000 | 418,711.41 ns | 9,323.778 ns | 10,737.277 ns | 4 | - | - | - | 34 B | 80 B |
| | | | | | | | | | | | | |
| maxItem | After | LocalBuild | 100 | 14.99 ns | 0.050 ns | 0.058 ns | 1 | 0.0038 | - | - | 24 B | 218 B |
| maxItem | Before | Default | 100 | 31.11 ns | 0.067 ns | 0.072 ns | 3 | 0.0037 | - | - | 24 B | 218 B |
| maxItem | After | LocalBuild | 10000 | 23.80 ns | 0.159 ns | 0.183 ns | 2 | 0.0037 | - | - | 24 B | 218 B |
| maxItem | Before | Default | 10000 | 52.40 ns | 0.135 ns | 0.156 ns | 4 | 0.0037 | - | - | 24 B | 218 B |
| | | | | | | | | | | | | |
| itemCount | After | LocalBuild | 100 | 200.70 ns | 0.847 ns | 0.870 ns | 1 | - | - | - | - | 96 B |
| itemCount | Before | Default | 100 | 419.93 ns | 0.937 ns | 1.079 ns | 2 | - | - | - | - | 138 B |
| itemCount | After | LocalBuild | 10000 | 25,581.85 ns | 188.342 ns | 216.895 ns | 3 | - | - | - | - | 96 B |
| itemCount | Before | Default | 10000 | 46,754.89 ns | 202.769 ns | 225.377 ns | 4 | - | - | - | - | 138 B |
| | | | | | | | | | | | | |
| iterForeach | After | LocalBuild | 100 | 2,881.03 ns | 7.049 ns | 7.835 ns | 1 | 0.9660 | - | - | 6120 B | 280 B |
| iterForeach | Before | Default | 100 | 3,608.70 ns | 12.932 ns | 14.892 ns | 2 | 0.9644 | - | - | 6120 B | 280 B |
| iterForeach | After | LocalBuild | 10000 | 314,901.59 ns | 1,778.653 ns | 1,976.968 ns | 3 | 95.0000 | - | - | 600128 B | 280 B |
| iterForeach | Before | Default | 10000 | 381,488.32 ns | 914.308 ns | 1,016.251 ns | 4 | 94.5122 | - | - | 600127 B | 280 B |
| | | | | | | | | | | | | |
| addItem | After | LocalBuild | 100 | 193.98 ns | 0.587 ns | 0.652 ns | 1 | 0.0500 | - | - | 317 B | 499 B |
| addItem | Before | Default | 100 | 291.34 ns | 1.804 ns | 1.931 ns | 2 | 0.0501 | - | - | 317 B | 542 B |
| addItem | After | LocalBuild | 10000 | 43,575.99 ns | 216.915 ns | 249.800 ns | 3 | 9.2188 | 2.8125 | - | 58637 B | 499 B |
| addItem | Before | Default | 10000 | 62,096.44 ns | 205.697 ns | 228.632 ns | 4 | 9.1667 | 2.7083 | - | 58637 B | 542 B |
| | | | | | | | | | | | | |
| removeItem | After | LocalBuild | 100 | 12.05 ns | 0.055 ns | 0.061 ns | 1 | 0.0064 | - | - | 40 B | 447 B |
| removeItem | Before | Default | 100 | 14.71 ns | 0.248 ns | 0.285 ns | 2 | 0.0064 | - | - | 40 B | 500 B |
| removeItem | After | LocalBuild | 10000 | 1,183.65 ns | 9.752 ns | 11.231 ns | 3 | 0.6343 | - | - | 4000 B | 447 B |
| removeItem | Before | Default | 10000 | 1,484.44 ns | 13.358 ns | 14.848 ns | 4 | 0.6368 | - | - | 4000 B | 500 B |
@buybackoff

Copy link
Copy Markdown
ContributorAuthor

Does anyone have an idea where to starts with the errors? All FSharp.Core tests are passing. Locally I have different errors vs CI, and CI output is completely useless.

I have a candidate for review - a monstrous method compareStacks, rewriting which took more time than everything else. But it failed initially in tests and then I fixed it. Maybe test coverage misses something, will review again.

isEmpty check should be at the top, both x1 and x2 must be not empty to then safely match one them
@buybackoff

Copy link
Copy Markdown
ContributorAuthor

Ops, touch screen on mobile... and 90 minutes more for CI :(

@buybackoff

Copy link
Copy Markdown
ContributorAuthor

It's basically green One task failed due to timeout (like in the previous PR). I pushed some formatting changes, mostly to trigger CI. If it fails again we will need to re-run it.

@cartermpcartermp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@cartermp
cartermp merged commit 2e40961 into dotnet:mainSep 28, 2020
nosami pushed a commit to xamarin/visualfsharp that referenced this pull request Feb 23, 2021
* FSharp.Core: Set: optimize tree layout
Same changes as in dotnet#10188
| Method | Job | BuildConfiguration | Size | Mean | Error | StdDev | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated | Code Size |
|------------ |------- |------------------- |------ |--------------:|-------------:|--------------:|-----:|--------:|-------:|------:|----------:|----------:|
| containsKey | After | LocalBuild | 100 | 30.48 ns | 0.319 ns | 0.367 ns | 1 | - | - | - | - | 177 B |
| containsKey | Before | Default | 100 | 46.77 ns | 0.172 ns | 0.199 ns | 2 | - | - | - | - | 261 B |
| containsKey | After | LocalBuild | 10000 | 56.06 ns | 0.358 ns | 0.412 ns | 3 | - | - | - | - | 177 B |
| containsKey | Before | Default | 10000 | 92.14 ns | 0.314 ns | 0.362 ns | 4 | - | - | - | - | 261 B |
| | | | | | | | | | | | | |
| isSubsetOf | After | LocalBuild | 100 | 1,003.26 ns | 7.438 ns | 8.565 ns | 1 | 0.0040 | - | - | 32 B | 80 B |
| isSubsetOf | Before | Default | 100 | 1,464.29 ns | 10.892 ns | 12.106 ns | 2 | - | - | - | 32 B | 80 B |
| isSubsetOf | After | LocalBuild | 10000 | 301,895.28 ns | 3,344.640 ns | 3,851.692 ns | 3 | - | - | - | 34 B | 80 B |
| isSubsetOf | Before | Default | 10000 | 418,711.41 ns | 9,323.778 ns | 10,737.277 ns | 4 | - | - | - | 34 B | 80 B |
| | | | | | | | | | | | | |
| maxItem | After | LocalBuild | 100 | 14.99 ns | 0.050 ns | 0.058 ns | 1 | 0.0038 | - | - | 24 B | 218 B |
| maxItem | Before | Default | 100 | 31.11 ns | 0.067 ns | 0.072 ns | 3 | 0.0037 | - | - | 24 B | 218 B |
| maxItem | After | LocalBuild | 10000 | 23.80 ns | 0.159 ns | 0.183 ns | 2 | 0.0037 | - | - | 24 B | 218 B |
| maxItem | Before | Default | 10000 | 52.40 ns | 0.135 ns | 0.156 ns | 4 | 0.0037 | - | - | 24 B | 218 B |
| | | | | | | | | | | | | |
| itemCount | After | LocalBuild | 100 | 200.70 ns | 0.847 ns | 0.870 ns | 1 | - | - | - | - | 96 B |
| itemCount | Before | Default | 100 | 419.93 ns | 0.937 ns | 1.079 ns | 2 | - | - | - | - | 138 B |
| itemCount | After | LocalBuild | 10000 | 25,581.85 ns | 188.342 ns | 216.895 ns | 3 | - | - | - | - | 96 B |
| itemCount | Before | Default | 10000 | 46,754.89 ns | 202.769 ns | 225.377 ns | 4 | - | - | - | - | 138 B |
| | | | | | | | | | | | | |
| iterForeach | After | LocalBuild | 100 | 2,881.03 ns | 7.049 ns | 7.835 ns | 1 | 0.9660 | - | - | 6120 B | 280 B |
| iterForeach | Before | Default | 100 | 3,608.70 ns | 12.932 ns | 14.892 ns | 2 | 0.9644 | - | - | 6120 B | 280 B |
| iterForeach | After | LocalBuild | 10000 | 314,901.59 ns | 1,778.653 ns | 1,976.968 ns | 3 | 95.0000 | - | - | 600128 B | 280 B |
| iterForeach | Before | Default | 10000 | 381,488.32 ns | 914.308 ns | 1,016.251 ns | 4 | 94.5122 | - | - | 600127 B | 280 B |
| | | | | | | | | | | | | |
| addItem | After | LocalBuild | 100 | 193.98 ns | 0.587 ns | 0.652 ns | 1 | 0.0500 | - | - | 317 B | 499 B |
| addItem | Before | Default | 100 | 291.34 ns | 1.804 ns | 1.931 ns | 2 | 0.0501 | - | - | 317 B | 542 B |
| addItem | After | LocalBuild | 10000 | 43,575.99 ns | 216.915 ns | 249.800 ns | 3 | 9.2188 | 2.8125 | - | 58637 B | 499 B |
| addItem | Before | Default | 10000 | 62,096.44 ns | 205.697 ns | 228.632 ns | 4 | 9.1667 | 2.7083 | - | 58637 B | 542 B |
| | | | | | | | | | | | | |
| removeItem | After | LocalBuild | 100 | 12.05 ns | 0.055 ns | 0.061 ns | 1 | 0.0064 | - | - | 40 B | 447 B |
| removeItem | Before | Default | 100 | 14.71 ns | 0.248 ns | 0.285 ns | 2 | 0.0064 | - | - | 40 B | 500 B |
| removeItem | After | LocalBuild | 10000 | 1,183.65 ns | 9.752 ns | 11.231 ns | 3 | 0.6343 | - | - | 4000 B | 447 B |
| removeItem | Before | Default | 10000 | 1,484.44 ns | 13.358 ns | 14.848 ns | 4 | 0.6368 | - | - | 4000 B | 500 B |
* FSharp.Core: Set: fix possible NRE in compareStacks
isEmpty check should be at the top, both x1 and x2 must be not empty to then safely match one them
* FSharp.Core: Set: formatting
Sign up for freeto 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.

5 participants

@buybackoff@forki@vzarytovskii@cartermp@dsyme