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

[Ready for Review] Slightly improve performance #2299

Merged
merged 7 commits into from May 2, 2017
Merged

Conversation

0x53A
Copy link
Contributor

@0x53A 0x53A commented Apr 28, 2017

Let's see what the CI says.

ref #2289

</PropertyGroup>
<ItemGroup>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.1.0" PrivateAssets="all" />
<!--<PackageReference Include="SourceLink.Create.CommandLine" Version="2.1.0" PrivateAssets="all" />-->
Copy link
Member

Choose a reason for hiding this comment

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

Why are these commented now?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Member

Choose a reason for hiding this comment

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

cool 👍

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I will revert it after finishing this pr and before it get's merged, that was just so I could debug it locally.
Someone else should take care of this, either fix it or just roll https://github.com/fsprojects/Paket/pull/2200/files back.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@cloudRoutine does debugging work for you?

Copy link
Member

Choose a reason for hiding this comment

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

Debugging does work for me, although I never found debugging particularly useful for working on this function. Way too many iterations to go through, but maybe I should have tried conditional breakpoints.

@@ -10,5 +10,5 @@
<CreateProperty Value="@(EmbeddedFiles)">
<Output TaskParameter="Value" PropertyName="embed" />
</CreateProperty>
</Target>
</Target>-->
Copy link
Member

Choose a reason for hiding this comment

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

Why is this commented now?

Copy link
Contributor Author

Choose a reason for hiding this comment

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


knownConflicts
|> Seq.map (fun (conflicts,selectedVersion) ->
match selectedVersion with
| None when Set.isSubset conflicts allRequirements -> conflicts
| None when conflicts.IsSubsetOf( allRequirements ) -> conflicts
Copy link
Member

Choose a reason for hiding this comment

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

doesn't need parens

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

@cloudRoutine Thanks for taking a look, but that is a really early version. =)

Stylistically, I need to clean it up and revert a bunch.

The relevant change to review is fuseConflicts and especially the condition leading to
https://github.com/fsprojects/Paket/pull/2299/files#diff-67971315cd3928195536b7ac5f0428fbR666

@cloudRoutine
Copy link
Member

very confident, working on this one is annoying isn't it? 😆

1) Error : Paket.DependencyGraphSpecs.should solve strange graph
System.Exception : There was a version conflict during package resolution.
  Resolved packages:
   - P3 1.1.3
   - P7 11.10.10.3
  Could not resolve package P8 <= 0.2.8:
   - No versions available.
  Please try to relax some conditions or resolve the conflict manually 
...
2) Error : Paket.UpdateProcess.Test.SelectiveUpdate considers package name case difference
System.Exception : There was a version conflict during package resolution.
  Resolved packages:
   - Castle.Core-log4net 4.0.0
  Could not resolve package castle.core 3.2:
   - Castle.Core-log4net 4.0.0 requested package castle.core: >= 4.0
  Please try to relax some conditions or resolve the conflict manually 
...
3) Error : Paket.UpdateProcess.Test.SelectiveUpdate does not update when a dependency constrain is not met
System.Exception : There was a version conflict during package resolution.
  Resolved packages:
   - Castle.Core-log4net 4.0.0
  Could not resolve package Castle.Core 3.2:
   - Castle.Core-log4net 4.0.0 requested package Castle.Core: >= 4.0
  Please try to relax some conditions or resolve the conflict manually 
 ...

it looks like it's cutting out too quickly now

@@ -681,7 +717,7 @@ let Resolve (getVersionsF, getPackageDetailsF, groupName:GroupName, globalStrate
let flags =
StepFlags(flags.Ready,flags.UseUnlisted,flags.HasUnlisted,true,flags.FirstTrial,flags.UnlistedSearch)
Copy link
Member

Choose a reason for hiding this comment

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

Now that we're on F# 4.1 StepFlags should be changed to a struct record

@cloudRoutine
Copy link
Member

@0x53A you're checking the IL to make sure it stays tailrec right? (just making sure)

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

@cloudRoutine If it weren't, it would stackoverflow =)

I have "solved" the failing UTs by falling back to the old behaviour (go back one) if it can't find a matching step to fall back to, but that probably just masks an issue within findMatchingStep .

@cloudRoutine
Copy link
Member

Were you encountering stack overflows on the unit tests when it wasn't tailrec? I'm not sure that any of them pull in enough dependencies to cause it, and I can't remember if I added one to make sure 😄

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

Not on the unit tests, but on the dependencies file from the original issue.

You can see my let x = ...; x dance in 2fa007c, that was to disable tailrec, so that I could properly debug it.

@@ -35,9 +36,13 @@
<StartArguments>install</StartArguments>
<StartWorkingDirectory>C:\dev\src\Paket\integrationtests\scenarios\loading-scripts\dependencies-file-flag\temp</StartWorkingDirectory>
<StartArguments>install</StartArguments>
<StartWorkingDirectory>C:\Users\lr\Source\Repos\castos</StartWorkingDirectory>
<StartWorkingDirectory>C:\Users\lr\Source\Repos\paket-perf-repro</StartWorkingDirectory>
Copy link
Member

Choose a reason for hiding this comment

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

don't forget to cut these out

@cloudRoutine
Copy link
Member

Can you add that dependencies file as a test case?

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

Soo ci is green again. Will do the rest on the evening.

@cloudRoutine
Copy link
Member

Great work on this 💪

(not x.VersionRequirement.Range.IsGlobalOverride,x.Depth)
(not y.VersionRequirement.Range.IsGlobalOverride,y.Depth)
yield match startWithPackage with
if obj.ReferenceEquals(x, y) then 0 else
Copy link
Member

Choose a reason for hiding this comment

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

why was obj.ReferenceEquals necessary instead of =? just curious

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not necessary, but performance improvement.
It first compared the whole objects, then compared each member again.

Profiler showed a small improvement.

Copy link
Member

Choose a reason for hiding this comment

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

I thought = made use of custom equality, or is the obj.ReferenceEquals faster than that?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes and yes.

ref-equals is just a single pointer comparison, the custom equality is one (potentially de-virtualized) virtual call, one type-test (https://github.com/0x53A/Paket/blob/932400899c3927c823cc9b869de545de71c650f2/src/Paket.Core/Versioning/Requirements.fs#L771) and up to 6 member comparisons. And if any of these members are non-equal, then they are just compared again in Compare itself.

Afaik profiling showed a single-digit-% performance improvement, but I want to rerun these tests anyway.

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

I think another quick win may be ordering the Requirements so that fixed versions are resolved first.

E.g. I was testing #2294 (comment) and noticed the following warning:

 Could not resolve package NETStandard.Library 1.6:
   - Amazon.Lambda.APIGatewayEvents 1.1.0 requested package NETStandard.Library: >= 1.6
   - Amazon.Lambda.AspNetCoreServer 0.8.1-preview1 requested package NETStandard.Library: >= 1.6
   - FluentAssertions 4.19.2 requested package NETStandard.Library: >= 1.6
   - Microsoft.AspNetCore.Mvc.Core 1.1.2 requested package NETStandard.Library: >= 1.6.1
   - Microsoft.Extensions.Configuration.Json 1.1.0 requested package NETStandard.Library: >= 1.6.1
   - xunit.extensibility.execution 2.3.0-beta1-build3642 requested package NETStandard.Library: >= 1.6

But logically speaking, that warning is backwards.
NETStandard.Library is pinned and doesn't need resolving, the other packages need to be resolved for it.

At the moment it seems to resolve it in the order it is specified in paket.dependencies:

@forki
Copy link
Member

forki commented Apr 28, 2017

ordering is very important. In general the heuristic was to resolve things with high conflict potential first. then fixed versions.

@forki
Copy link
Member

forki commented Apr 28, 2017

can we please get a mergeable PR before you start new work? Just to get this into the bank.

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

I'm not really happy with how the current check works - it just compares the name of the conflicting requirements to the names of the previously solved requirements and if it can't find one it just re-solves the previous one (which is what it did before). So there may (and surely are) still degenerate dependency files which will take forever to solve.

The correct way would be to walk the whole dependency chain and check if any conditions actually conflicts.

My plan (for this evening) was to split this in two PRs:

  • basic performance improvements (like the Comparison method)
  • the change to the Resolver

Now I don't think the resolver change is bad - the unit tests pass, so it shouldn't actually make it worse - but it is far from perfect, so it may be worth it to pull now anyway and improve it later.

If you want to merge it NOW, feel free to cherry-pick and clean up the changes to PackageResolver.fs

( I can't push from behind the work-firewall ...)

@cloudRoutine
Copy link
Member

I'll clean this up and get it merge ready

@@ -681,7 +726,7 @@ let Resolve (getVersionsF, getPackageDetailsF, groupName:GroupName, globalStrate
let flags =
StepFlags(flags.Ready,flags.UseUnlisted,flags.HasUnlisted,true,flags.FirstTrial,flags.UnlistedSearch)

step (Inner((continueConflict,lastStep,lastRequirement),priorConflictSteps)) stackpack lastCompatibleVersions lastFlags
step (Inner((continueConflict,lastStep,lastRequirement),priorConflictSteps)) stackpack lastCompatibleVersions flags
Copy link
Contributor Author

@0x53A 0x53A Apr 28, 2017

Choose a reason for hiding this comment

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

this was left-over from one of my experiments, I didn't mean to commit it. flags is created above, but never used, so it looked suspicious.

What do you think @cloudRoutine?

Unit tests are green WITH this change, I plan to revert it and rerun the unit tests ...

Copy link
Member

Choose a reason for hiding this comment

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

yea I was wondering about this, it's been a few months so I'm not totally sure what it should have been, but I think I may have meant to write

let flags =StepFlags(lastFlags.Ready,lastFlags.UseUnlisted,lastFlags.HasUnlisted,true,lastFlags.FirstTrial,lastFlags.UnlistedSearch)
                        
step (Inner((continueConflict,lastStep,lastRequirement),priorConflictSteps)) stackpack lastCompatibleVersions  flags 

Copy link
Contributor Author

@0x53A 0x53A Apr 28, 2017

Choose a reason for hiding this comment

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

Since the unit tests seem to be green either way - how would this affect execution?
Can you imagine any case where this would make a difference?

Copy link
Member

Choose a reason for hiding this comment

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

the unit tests aren't are reliable check on restore's functionality, the full integration test suite is needed to put it through it's paces

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, but the serverbuild was green before this PR, and it is now green with this PR, so unless this is also affected by the change to fuseConflicts it looks like it doesn't matter.

Or are the integration tests not run on PRs?

Copy link
Member

Choose a reason for hiding this comment

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

now that I actually have the code in front of me in VS, that's the force break flag, so that should just bail us out of resolution faster and it probably shouldn't make much of a difference what the other flags are (don't quote me on that ;P)

step (Inner((continueConflict,lastStep,lastRequirement),priorConflictSteps)) stackpack lastCompatibleVersions lastFlags
| None ->
// could not find a specific package - go back one
let (lastConflict,lastStep,lastRequirement,lastCompatibleVersions,lastFlags) :: priorConflictSteps = priorConflictSteps
Copy link
Member

Choose a reason for hiding this comment

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

Is this supposed to pull the head off of priorConflictSteps as (lastConflict,lastStep,lastRequirement,lastCompatibleVersions,lastFlags) and then alias it's tail as priorConflictSteps ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

exactly, this uses the previous behaviour as a fallback if it can't find a specific one

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This was required to fix the three failing tests

@cloudRoutine
Copy link
Member

@0x53A yea you should probably make a new PR and just cherry pick what you need onto it, all the commits between your initial ones and now made rebasing a big pain.

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

If you don't mind I would just squash it all into one
(backup of the old branch is at https://github.com/0x53A/Paket/tree/old-perf)

@0x53A
Copy link
Contributor Author

0x53A commented Apr 28, 2017

It's not safe to compare tuples by reference (see dotnet/fsharp#2923), so I have modified findMatchingStep slightly. It now gets the index first.

Do you know of a nicer way to remove a single index from a list?

@0x53A
Copy link
Contributor Author

0x53A commented Apr 30, 2017

I did a quick benchmark, and it looks like foldback has a relatively high overhead: https://gist.github.com/0x53A/d6d30523e04c7e1c448668546c6d69f9
(Edit: benchmarking is hard, after fixing an issue with the benchmark, it looks like foldback is actually faster =) )

@forki
Copy link
Member

forki commented Apr 30, 2017

Do we have any numbers in how perf improves?

@0x53A
Copy link
Contributor Author

0x53A commented Apr 30, 2017

The Resolving is only cpu bound if the algorithm degrades. That means the really relevant part was the change to fuseConflicts, the other performance optimizations would be unnecessary if the algorithm was perfect.

Currently it still degrades in a few situations, but it is already better than before.

Especially the last two commits are completely unnecessary performance-wise, my main motivation was readability and extracting it to a helper function, the benchmark was just curiosity.


For performance testing, it would be great if you had any other dependencies files which did correctly solve before (so that we can actually compare numbers), and took maybe a minute or two, so that we don't need to wait too long.

For the next round of improvements I want to set up a benchmark script that checks out a git sha, builds it, and runs a few paket installs against a few different paket.dependencies.


Before: https://github.com/fsprojects/Paket/releases/tag/5.0.0-alpha007
Now: commit f5deb48


  1. from Paket 4.x install command takes hours to complete (while 3.x takes minutes) #2289
#2289

redirects: on
framework: net46

source https://api.nuget.org/v3/index.json

nuget Akka.Persistence.SqlServer
nuget SQLProvider
nuget Microsoft.FSharpLu.Json
nuget Microsoft.Net.Http
nuget Microsoft.AspNet.WebApi.Client
nuget FSharp.Core redirects: force
nuget FSharp.Configuration
nuget FSharp.Formatting
nuget FSharp.Data
nuget FSharp.Data.TypeProviders
nuget Newtonsoft.Json
nuget FAKE
nuget SourceLink.Fake
nuget Akka
nuget Akka.FSharp
nuget Akka.Persistence
nuget Akka.Persistence.FSharp
nuget Akka.Persistence.Sql.Common
nuget Akka.Persistence.Query
nuget Akka.Persistence.Query.Sql
nuget Akka.Logger.Serilog
nuget Akka.Monitoring
nuget Akka.Monitoring.StatsD
nuget Akka.TestKit.NUnit
nuget Akka.TestKit.Xunit2
nuget Akka.Serialization.Wire
nuget FsPickler
nuget Serilog
nuget Serilog.Sinks.ElasticSearch
nuget Nest ~> 5
nuget RabbitMQ.Client
nuget SSH.NET
nuget Topshelf
nuget Topshelf.Serilog
nuget NUnit ~> 2
nuget NUnit.Runners
nuget NUnitTestAdapter
nuget TickSpec.NUnit content: none
nuget FsCheck
nuget FsCheck.Nunit
nuget System.Collections.Immutable
nuget Suave
nuget OctopusTools
nuget Suave.Swagger
nuget Quartz
nuget Akka.Quartz.Actor
nuget Oracle.ManagedDataAccess

Before: didn't finish after an hour
Now: 44 seconds - ready.


  1. from Cannot pin NETStandard.Library = 1.6.0 #2294 (comment)

The original paket.dependencies from the issue fails with an error, but this reduced one resolves correctly. (see #2305 for the failure)

source https://www.nuget.org/api/v2/

nuget NETStandard.Library <= 1.6.0
nuget Microsoft.AspNetCore.Mvc.Core

Now: 5 minutes, 1 second - ready.
Before: 1 hour, 8 minutes, 21 seconds - ready.

paket.log.txt

created lockfile

NUGET
remote: https://www.nuget.org/api/v2

Microsoft.AspNetCore.Authorization (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Logging.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Options (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Security.Claims (>= 4.0.1) - framework: >= netstandard13
Microsoft.AspNetCore.Hosting.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Hosting.Server.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.AspNetCore.Http.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Configuration.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.DependencyInjection.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.FileProviders.Abstractions (>= 1.0.1) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Logging.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
Microsoft.AspNetCore.Hosting.Server.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Features (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Configuration.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
Microsoft.AspNetCore.Http (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.AspNetCore.WebUtilities (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.ObjectPool (>= 1.0.1) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Options (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Net.Http.Headers (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Buffers (>= 4.0) - framework: >= net451, >= netstandard13
  System.Threading (>= 4.0.11) - framework: >= netstandard13
Microsoft.AspNetCore.Http.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Features (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Globalization.Extensions (>= 4.0.1) - framework: >= netstandard13
  System.Linq.Expressions (>= 4.1.1) - framework: >= netstandard13
  System.Reflection.TypeExtensions (>= 4.1) - framework: >= netstandard13
  System.Runtime.InteropServices (>= 4.1) - framework: >= netstandard13
  System.Text.Encodings.Web (>= 4.0) - framework: >= net451, >= netstandard13
Microsoft.AspNetCore.Http.Extensions (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.FileProviders.Abstractions (>= 1.0.1) - framework: >= net451, >= netstandard13
  Microsoft.Net.Http.Headers (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Buffers (>= 4.0) - framework: >= net451, >= netstandard13
  System.IO.FileSystem (>= 4.0.1) - framework: >= netstandard13
Microsoft.AspNetCore.Http.Features (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Primitives (>= 1.0.1) - framework: >= net451, >= netstandard13
  System.Collections (>= 4.0.11) - framework: >= netstandard13
  System.ComponentModel (>= 4.0.1) - framework: >= netstandard13
  System.Linq (>= 4.1) - framework: >= netstandard13
  System.Net.Primitives (>= 4.0.11) - framework: >= netstandard13
  System.Net.WebSockets (>= 4.0) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard13
  System.Security.Claims (>= 4.0.1) - framework: >= netstandard13
  System.Security.Cryptography.X509Certificates (>= 4.1) - framework: >= netstandard13
  System.Security.Principal (>= 4.0.1) - framework: >= netstandard13
Microsoft.AspNetCore.Mvc.Abstractions (1.0.3) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Routing.Abstractions (>= 1.0.3) - framework: >= net451, >= netstandard13
  Microsoft.CSharp (>= 4.0.1) - framework: >= netstandard13
  Microsoft.Net.Http.Headers (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.ComponentModel.TypeConverter (>= 4.1) - framework: >= netstandard13
  System.Reflection.Extensions (>= 4.0.1) - framework: >= netstandard13
  System.Text.Encoding.Extensions (>= 4.0.11) - framework: >= netstandard13
Microsoft.AspNetCore.Mvc.Core (1.0.3)
  Microsoft.AspNetCore.Authorization (>= 1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Hosting.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http (>= 1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Mvc.Abstractions (>= 1.0.3) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Routing (>= 1.0.3) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.DependencyModel (>= 1.0) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.FileProviders.Abstractions (>= 1.0.1) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Logging.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.PlatformAbstractions (>= 1.0) - framework: >= net451, >= netstandard16
  System.Buffers (>= 4.0) - framework: >= net451, >= netstandard16
  System.Diagnostics.DiagnosticSource (>= 4.0) - framework: >= net451, >= netstandard16
  System.Text.Encoding (>= 4.0.11) - framework: >= netstandard16
Microsoft.AspNetCore.Routing (1.0.3) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Extensions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.AspNetCore.Routing.Abstractions (>= 1.0.3) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Logging.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.ObjectPool (>= 1.0.1) - framework: >= net451, >= netstandard13
  Microsoft.Extensions.Options (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Collections (>= 4.0.11) - framework: >= netstandard13
  System.Text.RegularExpressions (>= 4.1) - framework: >= netstandard13
Microsoft.AspNetCore.Routing.Abstractions (1.0.3) - framework: >= net451, >= netstandard16
  Microsoft.AspNetCore.Http.Abstractions (>= 1.0.2) - framework: >= net451, >= netstandard13
  System.Collections.Concurrent (>= 4.0.12) - framework: >= netstandard13
  System.Reflection.Extensions (>= 4.0.1) - framework: >= netstandard13
  System.Threading.Tasks (>= 4.0.11) - framework: >= netstandard13
Microsoft.AspNetCore.WebUtilities (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Primitives (>= 1.0.1) - framework: >= net451, >= netstandard13
  System.Buffers (>= 4.0) - framework: >= net451, >= netstandard13
  System.Collections (>= 4.0.11) - framework: >= netstandard13
  System.IO (>= 4.1) - framework: >= netstandard13
  System.IO.FileSystem (>= 4.0.1) - framework: >= netstandard13
  System.Text.Encodings.Web (>= 4.0) - framework: >= net451, >= netstandard13
Microsoft.CSharp (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Dynamic.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Linq (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Linq.Expressions (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.ObjectModel (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Reflection (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Reflection.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Reflection.Primitives (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Reflection.TypeExtensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
Microsoft.DotNet.PlatformAbstractions (1.1.1) - framework: >= net451, >= netstandard16
  System.AppContext (>= 4.1) - framework: >= netstandard13
  System.Collections (>= 4.0.11) - framework: >= netstandard13
  System.IO (>= 4.1) - framework: >= netstandard13
  System.IO.FileSystem (>= 4.0.1) - framework: >= netstandard13
  System.Reflection.TypeExtensions (>= 4.1) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard13
  System.Runtime.InteropServices (>= 4.1) - framework: >= netstandard13
  System.Runtime.InteropServices.RuntimeInformation (>= 4.0) - framework: >= netstandard13
Microsoft.Extensions.Configuration.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Primitives (>= 1.0.1) - framework: >= netstandard10
  System.Linq (>= 4.1) - framework: >= netstandard10
Microsoft.Extensions.DependencyInjection.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  System.ComponentModel (>= 4.0.1) - framework: >= netstandard10
  System.Diagnostics.Debug (>= 4.0.11) - framework: >= netstandard10
  System.Globalization (>= 4.0.11) - framework: >= netstandard10
  System.Linq (>= 4.1) - framework: >= netstandard10
  System.Linq.Expressions (>= 4.1.1) - framework: >= netstandard10
  System.Reflection (>= 4.1) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard10
Microsoft.Extensions.DependencyModel (1.1.1) - framework: >= net451, >= netstandard16
  Microsoft.DotNet.PlatformAbstractions (>= 1.1.1) - framework: >= net451, netstandard13, >= netstandard16
  Newtonsoft.Json (>= 9.0.1) - framework: >= net451, netstandard13, >= netstandard16
  System.Diagnostics.Debug (>= 4.0.11) - framework: netstandard13, >= netstandard16
  System.Dynamic.Runtime (>= 4.0.11) - framework: netstandard13, >= netstandard16
  System.Linq (>= 4.1) - framework: netstandard13, >= netstandard16
Microsoft.Extensions.FileProviders.Abstractions (1.0.1) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.Primitives (>= 1.0.1) - framework: >= netstandard10
  System.IO (>= 4.1) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard10
Microsoft.Extensions.Logging.Abstractions (1.0.2) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.0.11) - framework: >= net45, >= netstandard11
  System.Collections.Concurrent (>= 4.0.12) - framework: >= net45, >= netstandard11
  System.Diagnostics.Debug (>= 4.0.11) - framework: >= net45, >= netstandard11
  System.Globalization (>= 4.0.11) - framework: >= net45, >= netstandard11
  System.Linq (>= 4.1) - framework: >= net45, >= netstandard11
  System.Reflection (>= 4.1) - framework: >= net45, >= netstandard11
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= net45, >= netstandard11
  System.Runtime.Extensions (>= 4.1) - framework: >= net45, >= netstandard11
  System.Runtime.InteropServices (>= 4.1) - framework: >= net45, >= netstandard11
Microsoft.Extensions.ObjectPool (1.0.1) - framework: >= net451, >= netstandard16
  System.Diagnostics.Debug (>= 4.0.11) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard13
  System.Threading (>= 4.0.11) - framework: >= netstandard13
Microsoft.Extensions.Options (1.0.2) - framework: >= net451, >= netstandard16
  Microsoft.Extensions.DependencyInjection.Abstractions (>= 1.0.2) - framework: >= netstandard10
  Microsoft.Extensions.Primitives (>= 1.0.1) - framework: >= netstandard10
  System.ComponentModel (>= 4.0.1) - framework: >= netstandard10
  System.Diagnostics.Debug (>= 4.0.11) - framework: >= netstandard10
  System.Globalization (>= 4.0.11) - framework: >= netstandard10
  System.Linq (>= 4.1) - framework: >= netstandard10
  System.Linq.Expressions (>= 4.1.1) - framework: >= netstandard10
  System.Reflection (>= 4.1) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard10
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard10
  System.Threading (>= 4.0.11) - framework: >= netstandard10
Microsoft.Extensions.PlatformAbstractions (1.0) - framework: >= net451, >= netstandard16
  System.AppContext (>= 4.1) - framework: >= netstandard13
  System.Reflection (>= 4.1) - framework: >= netstandard13
  System.Reflection.Extensions (>= 4.0.1) - framework: >= netstandard13
  System.Reflection.TypeExtensions (>= 4.1) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard13
Microsoft.Extensions.Primitives (1.0.1) - framework: >= net451, >= netstandard16
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard10
  System.Runtime (>= 4.1) - framework: >= netstandard10
Microsoft.Net.Http.Headers (1.0.2) - framework: >= net451, >= netstandard16
  System.Buffers (>= 4.0) - framework: >= net45, >= netstandard11
  System.Collections (>= 4.0.11) - framework: >= net45, >= netstandard11
  System.Diagnostics.Contracts (>= 4.0.1) - framework: >= net45, >= netstandard11
  System.Globalization (>= 4.0.11) - framework: >= net45, >= netstandard11
  System.Linq (>= 4.1) - framework: >= net45, >= netstandard11
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= net45, >= netstandard11
  System.Runtime.Extensions (>= 4.1) - framework: >= net45, >= netstandard11
  System.Text.Encoding (>= 4.0.11) - framework: >= net45, >= netstandard11
Microsoft.NETCore.Platforms (1.1) - framework: >= net45, >= netstandard10, netstandard11, netstandard12, netstandard13, netstandard14
Microsoft.NETCore.Targets (1.1) - framework: >= net45, >= netstandard10, netstandard11, netstandard12, netstandard13, netstandard14
Microsoft.Win32.Primitives (4.3) - framework: >= net45, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
NETStandard.Library (1.6)
  Microsoft.NETCore.Platforms (>= 1.0.1) - framework: >= netstandard10
  Microsoft.Win32.Primitives (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.AppContext (>= 4.1) - framework: >= net46, >= netstandard13
  System.Collections (>= 4.0.11) - framework: >= netstandard10
  System.Collections.Concurrent (>= 4.0.12) - framework: >= net45, >= netstandard11
  System.Console (>= 4.0) - framework: >= net46, >= netstandard13
  System.Diagnostics.Debug (>= 4.0.11) - framework: >= netstandard10
  System.Diagnostics.Tools (>= 4.0.1) - framework: >= netstandard10
  System.Diagnostics.Tracing (>= 4.1) - framework: >= net45, >= netstandard11
  System.Globalization (>= 4.0.11) - framework: >= netstandard10
  System.Globalization.Calendars (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.IO (>= 4.1) - framework: >= netstandard10
  System.IO.Compression (>= 4.1) - framework: >= net45, >= netstandard11
  System.IO.Compression.ZipFile (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.IO.FileSystem (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.IO.FileSystem.Primitives (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.Linq (>= 4.1) - framework: >= netstandard10
  System.Linq.Expressions (>= 4.1) - framework: >= netstandard10
  System.Net.Http (>= 4.1) - framework: >= net45, >= netstandard11
  System.Net.Primitives (>= 4.0.11) - framework: >= netstandard10
  System.Net.Sockets (>= 4.1) - framework: >= net46, >= netstandard13
  System.ObjectModel (>= 4.0.12) - framework: >= netstandard10
  System.Reflection (>= 4.1) - framework: >= netstandard10
  System.Reflection.Extensions (>= 4.0.1) - framework: >= netstandard10
  System.Reflection.Primitives (>= 4.0.1) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.0.1) - framework: >= netstandard10
  System.Runtime (>= 4.1) - framework: >= netstandard10
  System.Runtime.Extensions (>= 4.1) - framework: >= netstandard10
  System.Runtime.Handles (>= 4.0.1) - framework: >= net46, >= netstandard13
  System.Runtime.InteropServices (>= 4.1) - framework: >= net45, >= netstandard11
  System.Runtime.InteropServices.RuntimeInformation (>= 4.0) - framework: >= net45, >= netstandard11
  System.Runtime.Numerics (>= 4.0.1) - framework: >= net45, >= netstandard11
  System.Security.Cryptography.Algorithms (>= 4.2) - framework: >= net46, >= netstandard13
  System.Security.Cryptography.Encoding (>= 4.0) - framework: >= net46, >= netstandard13
  System.Security.Cryptography.Primitives (>= 4.0) - framework: >= net46, >= netstandard13
  System.Security.Cryptography.X509Certificates (>= 4.1) - framework: >= net46, >= netstandard13
  System.Text.Encoding (>= 4.0.11) - framework: >= netstandard10
  System.Text.Encoding.Extensions (>= 4.0.11) - framework: >= netstandard10
  System.Text.RegularExpressions (>= 4.1) - framework: >= netstandard10
  System.Threading (>= 4.0.11) - framework: >= netstandard10
  System.Threading.Tasks (>= 4.0.11) - framework: >= netstandard10
  System.Threading.Timer (>= 4.0.1) - framework: >= net451, >= netstandard12
  System.Xml.ReaderWriter (>= 4.0.11) - framework: >= netstandard10
  System.Xml.XDocument (>= 4.0.11) - framework: >= netstandard10
Newtonsoft.Json (10.0.1) - framework: >= net451, >= netstandard16
  Microsoft.CSharp (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Collections (>= 4.3) - framework: netstandard10, >= netstandard13
  System.ComponentModel.TypeConverter (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Dynamic.Runtime (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Globalization (>= 4.3) - framework: netstandard10, >= netstandard13
  System.IO (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Linq (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Linq.Expressions (>= 4.3) - framework: netstandard10, >= netstandard13
  System.ObjectModel (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Reflection (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Reflection.Extensions (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Runtime.Numerics (>= 4.3) - framework: >= netstandard13
  System.Runtime.Serialization.Formatters (>= 4.3) - framework: >= netstandard13
  System.Runtime.Serialization.Primitives (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Text.Encoding.Extensions (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Text.RegularExpressions (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Threading (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Xml.ReaderWriter (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Xml.XDocument (>= 4.3) - framework: netstandard10, >= netstandard13
  System.Xml.XmlDocument (>= 4.3) - framework: >= netstandard13
runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.native.System (4.3) - framework: >= net45, >= netstandard11
  Microsoft.NETCore.Platforms (>= 1.1)
  Microsoft.NETCore.Targets (>= 1.1)
runtime.native.System.IO.Compression (4.3) - framework: >= net45, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1)
  Microsoft.NETCore.Targets (>= 1.1)
runtime.native.System.Net.Http (4.3) - framework: >= net45, >= netstandard16
  Microsoft.NETCore.Platforms (>= 1.1)
  Microsoft.NETCore.Targets (>= 1.1)
runtime.native.System.Security.Cryptography.Apple (4.3) - framework: >= net45, >= netstandard16
  runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (>= 4.3)
runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
  runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
  runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3)
runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (4.3) - framework: >= net45, >= netstandard16
runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard13, netstandard14
System.AppContext (4.3) - framework: >= net451, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
System.Buffers (4.3) - framework: >= net45, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard11
  System.Diagnostics.Tracing (>= 4.3) - framework: >= netstandard11
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard11
  System.Runtime (>= 4.3) - framework: >= netstandard11
  System.Threading (>= 4.3) - framework: >= netstandard11
System.Collections (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Collections.Concurrent (4.3) - framework: >= net45, >= netstandard11, netstandard14
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Tracing (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Reflection (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
System.Collections.NonGeneric (4.3) - framework: >= net451, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Threading (>= 4.3) - framework: >= netstandard13
System.Collections.Specialized (4.3) - framework: >= net451, >= netstandard16
  System.Collections.NonGeneric (>= 4.3) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.Globalization.Extensions (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Threading (>= 4.3) - framework: >= netstandard13
System.ComponentModel (4.3) - framework: >= net451, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.ComponentModel.Primitives (4.3) - framework: >= net462, >= netstandard16
  System.ComponentModel (>= 4.3) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard10
  System.Runtime (>= 4.3) - framework: >= netstandard10
System.ComponentModel.TypeConverter (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Collections.NonGeneric (>= 4.3) - framework: >= net462, >= netstandard15
  System.Collections.Specialized (>= 4.3) - framework: >= netstandard15
  System.ComponentModel (>= 4.3) - framework: netstandard10, >= netstandard15
  System.ComponentModel.Primitives (>= 4.3) - framework: net45, >= net462, netstandard10, >= netstandard15, winv4.5, wpv8.0, wpav8.1
  System.Globalization (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Linq (>= 4.3) - framework: >= netstandard15
  System.Reflection (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Reflection.Extensions (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Reflection.Primitives (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Reflection.TypeExtensions (>= 4.3) - framework: >= netstandard15
  System.Resources.ResourceManager (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Runtime (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Runtime.Extensions (>= 4.3) - framework: netstandard10, >= netstandard15
  System.Threading (>= 4.3) - framework: netstandard10, >= netstandard15
System.Console (4.3) - framework: >= net46, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
System.Diagnostics.Contracts (4.3) - framework: >= net451, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Diagnostics.Debug (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Diagnostics.DiagnosticSource (4.3) - framework: >= net45, netstandard13, >= netstandard16
  System.Collections (>= 4.3) - framework: netstandard11, >= netstandard13
  System.Diagnostics.Tracing (>= 4.3) - framework: netstandard11, >= netstandard13
  System.Reflection (>= 4.3) - framework: netstandard11, >= netstandard13
  System.Runtime (>= 4.3) - framework: netstandard11, >= netstandard13
  System.Threading (>= 4.3) - framework: netstandard11, >= netstandard13
System.Diagnostics.Tools (4.3) - framework: >= net451, >= netstandard10
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard10
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, >= netstandard10
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Diagnostics.Tracing (4.3) - framework: >= net45, >= netstandard11, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15
System.Dynamic.Runtime (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Linq (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Linq.Expressions (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.ObjectModel (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Reflection (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Reflection.Emit (>= 4.3) - framework: >= netstandard13
  System.Reflection.Emit.ILGeneration (>= 4.3) - framework: >= netstandard13
  System.Reflection.Primitives (>= 4.3) - framework: >= netstandard13
  System.Reflection.TypeExtensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
System.Globalization (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Globalization.Calendars (4.3) - framework: >= net451, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
System.Globalization.Extensions (4.3) - framework: >= net45, >= netstandard16
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: >= netstandard13
System.IO (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
System.IO.Compression (4.3) - framework: >= net45, >= netstandard11, netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  runtime.native.System (>= 4.3) - framework: >= netstandard13
  runtime.native.System.IO.Compression (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Buffers (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.IO (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime.Handles (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, >= netstandard13
System.IO.Compression.ZipFile (4.3) - framework: >= net46, >= netstandard13
  System.Buffers (>= 4.3) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.IO.Compression (>= 4.3) - framework: >= netstandard13
  System.IO.FileSystem (>= 4.3) - framework: >= netstandard13
  System.IO.FileSystem.Primitives (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
System.IO.FileSystem (4.3) - framework: >= net45, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.IO.FileSystem.Primitives (>= 4.3) - framework: >= net46, >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Handles (>= 4.3) - framework: >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: >= netstandard13
System.IO.FileSystem.Primitives (4.3) - framework: >= net451, >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
System.Linq (4.3) - framework: >= net45, >= netstandard10, netstandard14
  System.Collections (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
System.Linq.Expressions (4.3) - framework: >= net451, >= netstandard10
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.IO (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Linq (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.ObjectModel (>= 4.3) - framework: >= netstandard16
  System.Reflection (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard16
  System.Reflection.Emit (>= 4.3) - framework: >= netstandard16
  System.Reflection.Emit.ILGeneration (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Reflection.Emit.Lightweight (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Reflection.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Reflection.Primitives (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Reflection.TypeExtensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard16
System.Net.Http (4.3.1) - framework: >= net45, >= netstandard11
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard13, >= netstandard16
  Microsoft.Win32.Primitives (>= 4.3) - framework: netstandard13
  runtime.native.System (>= 4.3) - framework: >= netstandard16
  runtime.native.System.Net.Http (>= 4.3) - framework: >= netstandard16
  runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard16
  System.Collections (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Diagnostics.DiagnosticSource (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Diagnostics.Tracing (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Globalization (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Globalization.Extensions (>= 4.3) - framework: >= netstandard16
  System.IO (>= 4.3) - framework: dnxcore50, netstandard11, netstandard13, >= netstandard16
  System.IO.Compression (>= 4.3) - framework: netstandard13
  System.IO.FileSystem (>= 4.3) - framework: >= netstandard16
  System.Net.Primitives (>= 4.3) - framework: dnxcore50, netstandard11, netstandard13, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard11, netstandard13, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Runtime.Handles (>= 4.3) - framework: netstandard13, >= netstandard16
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Security.Cryptography.Algorithms (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Encoding (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Primitives (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.X509Certificates (>= 4.3) - framework: >= net46, dnxcore50, netstandard13, >= netstandard16
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, netstandard11, netstandard13, >= netstandard16
  System.Threading (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard16
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, netstandard11, netstandard13, >= netstandard16
System.Net.Primitives (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, netstandard11, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, netstandard11, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard11, >= netstandard13
  System.Runtime.Handles (>= 4.3) - framework: dnxcore50, >= netstandard13
System.Net.Sockets (4.3) - framework: >= net46, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Net.Primitives (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: >= netstandard13
System.Net.WebSockets (4.3) - framework: >= net451, >= netstandard16
  Microsoft.Win32.Primitives (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: >= netstandard13
System.ObjectModel (4.3) - framework: >= net451, >= netstandard10
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
System.Reflection (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard12, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.IO (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Reflection.Primitives (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
System.Reflection.Emit (4.3) - framework: >= net451, >= netstandard16
  System.IO (>= 4.3) - framework: >= netstandard11
  System.Reflection (>= 4.3) - framework: >= netstandard11
  System.Reflection.Emit.ILGeneration (>= 4.3) - framework: >= netstandard11
  System.Reflection.Primitives (>= 4.3) - framework: >= netstandard11
  System.Runtime (>= 4.3) - framework: >= netstandard11
System.Reflection.Emit.ILGeneration (4.3) - framework: >= net451, >= netstandard16
  System.Reflection (>= 4.3) - framework: >= netstandard10
  System.Reflection.Primitives (>= 4.3) - framework: >= netstandard10
  System.Runtime (>= 4.3) - framework: >= netstandard10
System.Reflection.Emit.Lightweight (4.3) - framework: >= net451, >= netstandard16
  System.Reflection (>= 4.3) - framework: >= netstandard10
  System.Reflection.Emit.ILGeneration (>= 4.3) - framework: >= netstandard10
  System.Reflection.Primitives (>= 4.3) - framework: >= netstandard10
  System.Runtime (>= 4.3) - framework: >= netstandard10
System.Reflection.Extensions (4.3) - framework: >= net45, >= netstandard10
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard10
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, >= netstandard10
  System.Reflection (>= 4.3) - framework: dnxcore50, >= netstandard10
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Reflection.Primitives (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard12, netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard10
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, >= netstandard10
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Reflection.TypeExtensions (4.3) - framework: >= net451, >= netstandard16
  System.Reflection (>= 4.3) - framework: >= net462, dnxcore50, netstandard13, >= netstandard15
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard15
System.Resources.ResourceManager (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard10
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, >= netstandard10
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard10
  System.Reflection (>= 4.3) - framework: dnxcore50, >= netstandard10
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Runtime (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard12, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, netstandard12, netstandard13, >= netstandard15
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, netstandard12, netstandard13, >= netstandard15
System.Runtime.Extensions (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard15
System.Runtime.Handles (4.3) - framework: >= net45, >= netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
System.Runtime.InteropServices (4.3) - framework: >= net45, >= netstandard11, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15, netcore11
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15, netcore11
  System.Reflection (>= 4.3) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15, netcore11
  System.Reflection.Primitives (>= 4.3) - framework: dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15, netcore11
  System.Runtime (>= 4.3) - framework: net462, >= net463, dnxcore50, netstandard11, netstandard12, netstandard13, >= netstandard15, netcore11
  System.Runtime.Handles (>= 4.3) - framework: dnxcore50, netstandard13, >= netstandard15, netcore11
System.Runtime.InteropServices.RuntimeInformation (4.3) - framework: >= net45, >= netstandard11
  runtime.native.System (>= 4.3) - framework: >= netstandard11
  System.Reflection (>= 4.3) - framework: dnxcore50, >= netstandard11
  System.Reflection.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard11
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard11
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard11
  System.Runtime.InteropServices (>= 4.3) - framework: >= netstandard11
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard11
System.Runtime.Numerics (4.3) - framework: >= net45, >= netstandard11
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard11, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
System.Runtime.Serialization.Formatters (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: >= netstandard14
  System.Reflection (>= 4.3) - framework: >= netstandard14
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard14
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Serialization.Primitives (>= 4.3) - framework: >= net46, >= netstandard13
System.Runtime.Serialization.Primitives (4.3) - framework: >= net451, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Security.Claims (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Security.Principal (>= 4.3) - framework: >= netstandard13
System.Security.Cryptography.Algorithms (4.3) - framework: >= net45, >= netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard16
  runtime.native.System.Security.Cryptography.Apple (>= 4.3) - framework: >= netstandard16
  runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard16
  System.Collections (>= 4.3) - framework: >= netstandard16
  System.IO (>= 4.3) - framework: >= net463, dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime (>= 4.3) - framework: >= net463, dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime.Handles (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime.Numerics (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Encoding (>= 4.3) - framework: >= net463, dnxcore50, >= netstandard16
  System.Security.Cryptography.Primitives (>= 4.3) - framework: net46, net461, >= net463, dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, >= netstandard16
System.Security.Cryptography.Cng (4.3) - framework: >= net451, >= netstandard16
  Microsoft.NETCore.Platforms (>= 1.1) - framework: netstandard14, >= netstandard16
  System.IO (>= 4.3) - framework: netstandard13, netstandard14, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: netstandard14, >= netstandard16
  System.Runtime (>= 4.3) - framework: netstandard13, netstandard14, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: netstandard14, >= netstandard16
  System.Runtime.Handles (>= 4.3) - framework: netstandard13, netstandard14, >= netstandard16
  System.Runtime.InteropServices (>= 4.3) - framework: netstandard14, >= netstandard16
  System.Security.Cryptography.Algorithms (>= 4.3) - framework: net46, net461, >= net463, netstandard13, netstandard14, >= netstandard16
  System.Security.Cryptography.Encoding (>= 4.3) - framework: netstandard14, >= netstandard16
  System.Security.Cryptography.Primitives (>= 4.3) - framework: net46, net461, >= net463, netstandard13, netstandard14, >= netstandard16
  System.Text.Encoding (>= 4.3) - framework: netstandard14, >= netstandard16
System.Security.Cryptography.Csp (4.3) - framework: >= net451, >= netstandard16
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Reflection (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Runtime.Handles (>= 4.3) - framework: >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: >= netstandard13
  System.Security.Cryptography.Algorithms (>= 4.3) - framework: >= net46, >= netstandard13
  System.Security.Cryptography.Encoding (>= 4.3) - framework: >= netstandard13
  System.Security.Cryptography.Primitives (>= 4.3) - framework: >= net46, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
  System.Threading (>= 4.3) - framework: >= netstandard13
System.Security.Cryptography.Encoding (4.3) - framework: >= net45, >= netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: >= netstandard13
  runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard13
  System.Collections (>= 4.3) - framework: >= netstandard13
  System.Collections.Concurrent (>= 4.3) - framework: >= netstandard13
  System.Linq (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Runtime.Handles (>= 4.3) - framework: >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: >= netstandard13
  System.Security.Cryptography.Primitives (>= 4.3) - framework: >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
System.Security.Cryptography.OpenSsl (4.3) - framework: >= net45, >= netstandard16
  runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= net463, >= netstandard16, monoandroid, monotouch, xamarinios, xamarinmac
  System.Collections (>= 4.3) - framework: >= netstandard16
  System.IO (>= 4.3) - framework: >= net463, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard16
  System.Runtime (>= 4.3) - framework: >= net463, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: >= net463, >= netstandard16
  System.Runtime.Handles (>= 4.3) - framework: >= netstandard16
  System.Runtime.InteropServices (>= 4.3) - framework: >= netstandard16
  System.Runtime.Numerics (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Algorithms (>= 4.3) - framework: >= net463, >= netstandard16
  System.Security.Cryptography.Encoding (>= 4.3) - framework: >= net463, >= netstandard16
  System.Security.Cryptography.Primitives (>= 4.3) - framework: >= net463, >= netstandard16
  System.Text.Encoding (>= 4.3) - framework: >= netstandard16
System.Security.Cryptography.Primitives (4.3) - framework: >= net45, >= netstandard13, netstandard14
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Threading (>= 4.3) - framework: >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: >= netstandard13
System.Security.Cryptography.X509Certificates (4.3) - framework: >= net451, >= netstandard13
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard16
  runtime.native.System (>= 4.3) - framework: >= netstandard16
  runtime.native.System.Net.Http (>= 4.3) - framework: >= netstandard16
  runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard16
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard16
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Globalization.Calendars (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.IO (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.IO.FileSystem (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.IO.FileSystem.Primitives (>= 4.3) - framework: >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime.Handles (>= 4.3) - framework: dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime.Numerics (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Security.Cryptography.Algorithms (>= 4.3) - framework: net46, >= net461, dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Security.Cryptography.Cng (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Security.Cryptography.Csp (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Encoding (>= 4.3) - framework: net46, >= net461, dnxcore50, netstandard13, netstandard14, >= netstandard16
  System.Security.Cryptography.OpenSsl (>= 4.3) - framework: >= netstandard16
  System.Security.Cryptography.Primitives (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard16
System.Security.Principal (4.3) - framework: >= net451, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard10
System.Text.Encoding (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Text.Encoding.Extensions (4.3) - framework: >= net451, >= netstandard10
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Text.Encodings.Web (4.3) - framework: >= net451, >= netstandard16
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard10
  System.IO (>= 4.3) - framework: >= netstandard10
  System.Reflection (>= 4.3) - framework: >= netstandard10
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard10
  System.Runtime (>= 4.3) - framework: >= netstandard10
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard10
  System.Threading (>= 4.3) - framework: >= netstandard10
System.Text.RegularExpressions (4.3) - framework: >= net451, >= netstandard10
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, netstandard13, >= netstandard16, netcore11
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard16
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard16
System.Threading (4.3) - framework: >= net45, >= netstandard10, netstandard13, netstandard14
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Threading.Tasks (4.3) - framework: >= net45, >= netstandard10, netstandard11, netstandard13, netstandard14
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Threading.Tasks.Extensions (4.3) - framework: >= net451, >= netstandard13
  System.Collections (>= 4.3) - framework: >= netstandard10
  System.Runtime (>= 4.3) - framework: >= netstandard10
  System.Threading.Tasks (>= 4.3) - framework: >= netstandard10
System.Threading.Timer (4.3) - framework: >= net451, >= netstandard12
  Microsoft.NETCore.Platforms (>= 1.1) - framework: dnxcore50, >= netstandard12
  Microsoft.NETCore.Targets (>= 1.1) - framework: dnxcore50, >= netstandard12
  System.Runtime (>= 4.3) - framework: dnxcore50, >= netstandard12
System.Xml.ReaderWriter (4.3) - framework: >= net451, >= netstandard10
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.IO (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.IO.FileSystem (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.IO.FileSystem.Primitives (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime.InteropServices (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Text.Encoding.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Text.RegularExpressions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading.Tasks (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Threading.Tasks.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
System.Xml.XDocument (4.3) - framework: >= net451, >= netstandard10
  System.Collections (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Diagnostics.Tools (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Globalization (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.IO (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Reflection (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Runtime (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Threading (>= 4.3) - framework: dnxcore50, >= netstandard13
  System.Xml.ReaderWriter (>= 4.3) - framework: dnxcore50, netstandard10, >= netstandard13
System.Xml.XmlDocument (4.3) - framework: >= net451, >= netstandard16
  System.Collections (>= 4.3) - framework: >= netstandard13
  System.Diagnostics.Debug (>= 4.3) - framework: >= netstandard13
  System.Globalization (>= 4.3) - framework: >= netstandard13
  System.IO (>= 4.3) - framework: >= netstandard13
  System.Resources.ResourceManager (>= 4.3) - framework: >= netstandard13
  System.Runtime (>= 4.3) - framework: >= netstandard13
  System.Runtime.Extensions (>= 4.3) - framework: >= netstandard13
  System.Text.Encoding (>= 4.3) - framework: >= netstandard13
  System.Threading (>= 4.3) - framework: >= netstandard13
  System.Xml.ReaderWriter (>= 4.3) - framework: >= netstandard13

@matthid
Copy link
Member

matthid commented Apr 30, 2017

Just a note on performance: We have two resolver states since I introduced the runtime stuff. It might make sense to measure them separately... (or at least it's hard to compare them with previous paket versions)

@0x53A
Copy link
Contributor Author

0x53A commented Apr 30, 2017

With an older version (I assume pre 5.alpha) cloudroutine could resolve the second file in 2 minutes, now it takes me 5 minutes on this branch, so this may be worth investigating.

ref #2294 (comment)

But it seems unrelated to this PR, because with 5.0alpha I'm still waiting for it to finish, and 5 minutes is better than never =).

Having seperate printfs would certainly help a bit to show where the bottleneck lies, but I don't think most users actually care, they just want it to work, otherwise they would still just use neverget.

@0x53A 0x53A changed the title [WIP] performance [Ready for Review] Slightly improve performance Apr 30, 2017
@0x53A
Copy link
Contributor Author

0x53A commented Apr 30, 2017

@forki @cloudRoutine @matthid if you have some time, could you please test if you find any dependencies files that get slower after this pr?

If you just send me the paket.dependencies then I can also test it myself.

@0x53A
Copy link
Contributor Author

0x53A commented Apr 30, 2017

regarding the last commit:

before:
image

image

The name array was recalculated for each iteration.

now:
image

let c = compare x.Parent y.Parent
if c <> 0 then c else
let c = compare x.Name y.Name
if c <> 0 then c else 0
Copy link
Member

Choose a reason for hiding this comment

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

How much does this block yield? Because its really ugly :P

Copy link
Contributor Author

@0x53A 0x53A May 2, 2017

Choose a reason for hiding this comment

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

Because the old code was a thing of beauty? :D

According to my benchmark (take it with a truckload of salt) it is slightly faster: https://gist.github.com/0x53A/b8bb15e040d152742fd067ce257e80a2

Method Mean Error StdDev Gen 0 Allocated
Old 656.1 ns 6.2845 ns 4.9066 ns 0.0508 264 B
New 105.5 ns 0.3383 ns 0.2641 ns - 0 B

@@ -787,8 +815,7 @@ let Resolve (getVersionsF, getPackageDetailsF, groupName:GroupName, globalStrate

| stackpack, Some(alreadyExplored,exploredPackage) ->
let hasUnlisted = exploredPackage.Unlisted || flags.HasUnlisted
let flags =
StepFlags(flags.Ready,flags.UseUnlisted,hasUnlisted,flags.ForceBreak,flags.FirstTrial,flags.UnlistedSearch)
let flags = { flags with HasUnlisted = hasUnlisted }
Copy link
Member

Choose a reason for hiding this comment

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

let flags = { flags with HasUnlisted = exploredPackage.Unlisted || flags.HasUnlisted }

@matthid
Copy link
Member

matthid commented Apr 30, 2017

@0x53A After #2307 We could compare performance of these improvements with older paket versions as well (by setting the env var PAKET_DISABLE_RUNTIME_RESOLUTION to true ).
Currently the comparison is not really "fair" because we actually do a second resolver run...

@matthid
Copy link
Member

matthid commented May 1, 2017

I combined your improvements with #2307 in https://github.com/matthid/Paket/tree/combine_fixes but couldn't see any real benefits (But I didn't really measure anything)

@0x53A
Copy link
Contributor Author

0x53A commented May 1, 2017

In most cases, paket shouldn't be cpu bound, so any performance improvements in this area won't actually matter.

It will only actually improve performance if there are a lot of conflicts, and the solving algorithm degrades.

@forki forki merged commit 505c58c into fsprojects:master May 2, 2017
@0x53A 0x53A deleted the perf branch May 4, 2017 10:02
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.

None yet

4 participants