Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
915b940
Merge pull request #6199 from Microsoft/merges/dev16.0-to-dev16.1
Feb 6, 2019
2422d4c
Merge pull request #6203 from Microsoft/merges/master-to-dev16.1
Feb 6, 2019
2a89e4f
Merge remote-tracking branch 'upstream/dev16.0' into merges/dev16.0-t…
brettfo Feb 19, 2019
fc15661
Merge branch 'dev16.1' into merges/master-to-dev16.1
brettfo Feb 19, 2019
9cc4238
Merge pull request #6253 from Microsoft/merges/dev16.0-to-dev16.1
brettfo Feb 19, 2019
bce0c11
Merge pull request #6252 from Microsoft/merges/master-to-dev16.1
brettfo Feb 19, 2019
8a3cc20
Merge remote-tracking branch 'upstream/master' into merges/master-to-…
brettfo Feb 25, 2019
d1e7b78
Merge pull request #6262 from Microsoft/merges/master-to-dev16.1
Feb 25, 2019
532fd1a
Merge pull request #6279 from Microsoft/merges/master-to-dev16.1
Feb 26, 2019
afbea40
Merge pull request #6284 from Microsoft/merges/dev16.0-to-dev16.1
Feb 26, 2019
b44f118
Merge pull request #6283 from Microsoft/merges/master-to-dev16.1
Feb 26, 2019
97732dc
Merge pull request #6290 from Microsoft/merges/master-to-dev16.1
Feb 27, 2019
b6d8b38
Merge pull request #6297 from Microsoft/merges/master-to-dev16.1
Mar 2, 2019
a3402f6
Merge branch 'dev16.1' into merges/master-to-dev16.1
brettfo Mar 4, 2019
a23c16a
Merge pull request #6317 from Microsoft/merges/dev16.0-to-dev16.1
Mar 14, 2019
b06eb87
Merge pull request #6302 from Microsoft/merges/master-to-dev16.1
brettfo Mar 20, 2019
6022cd4
Merge branch 'dev16.1' into merges/master-to-dev16.1
brettfo Mar 20, 2019
829834c
Merge pull request #6340 from Microsoft/merges/master-to-dev16.1
Mar 20, 2019
c3c07c0
Merge pull request #6350 from Microsoft/merges/dev16.0-to-dev16.1
Mar 21, 2019
f2be9e4
Move SourceText: Microsoft.FSharp -> FSharp (#6356)
auduchinok Mar 29, 2019
1a0d385
Making ILVersionInfo a struct (#6392)
TIHan Mar 31, 2019
2b46085
When a solution becomes unloaded, we should clear F#'s cache (#6420)
TIHan Apr 3, 2019
d114678
Merge remote-tracking branch 'upstream/master' into merges/master-to-…
brettfo Apr 4, 2019
2a48826
Merge pull request #6430 from Microsoft/merges/master-to-dev16.1
brettfo Apr 5, 2019
8e73cee
Merge pull request #6440 from Microsoft/merges/master-to-dev16.1
Apr 6, 2019
6371327
Merge remote-tracking branch 'upstream/master' into merges/master-to-…
brettfo Apr 6, 2019
627a596
Merge pull request #6446 from Microsoft/merges/master-to-dev16.1
Apr 7, 2019
0b33beb
Merge pull request #6456 from Microsoft/merges/master-to-dev16.1
Apr 8, 2019
7f18481
Merge pull request #6460 from Microsoft/merges/master-to-dev16.1
Apr 9, 2019
b7e7b53
Merge pull request #6470 from Microsoft/merges/master-to-dev16.1
brettfo Apr 9, 2019
ca694c5
Merge pull request #6473 from Microsoft/merges/master-to-dev16.1
Apr 10, 2019
e542930
Merge pull request #6480 from Microsoft/merges/master-to-dev16.1
Apr 10, 2019
745c0c9
Merge pull request #6488 from Microsoft/merges/master-to-dev16.1
Apr 11, 2019
d7509d3
Merge branch 'dev16.1' into merges/master-to-dev16.1
KevinRansom Apr 12, 2019
d24ed0a
Merge pull request #6500 from Microsoft/merges/master-to-dev16.1
Apr 12, 2019
6c5d60d
Merge pull request #6517 from Microsoft/merges/master-to-dev16.1
Apr 13, 2019
22656c8
Merge pull request #6521 from Microsoft/merges/master-to-dev16.1
Apr 13, 2019
1cacfaf
Merge pull request #6529 from Microsoft/merges/master-to-dev16.1
Apr 14, 2019
9993d81
Merge pull request #6539 from Microsoft/merges/master-to-dev16.1
Apr 15, 2019
1e36a5e
Merge branch 'dev16.1' into merges/master-to-dev16.1
KevinRansom Apr 16, 2019
fd3d3df
Merge pull request #6553 from Microsoft/merges/master-to-dev16.1
Apr 16, 2019
7c0c71f
Add Pinvoke support on coreclr (#6542)
KevinRansom Apr 16, 2019
af5b4eb
Permit reduction of `Some` allocations for optional arguments (#6533)
dsyme Apr 16, 2019
0d18903
ensure all setup packages use the same version (#6556)
brettfo Apr 16, 2019
ed387e0
Will's fix (#6559)
KevinRansom Apr 16, 2019
a3d6e55
Merge pull request #6560 from Microsoft/merges/master-to-dev16.1
brettfo Apr 16, 2019
7fa61b7
[master] Update dependencies from dotnet/arcade (#6510)
dotnet-maestro[bot] Apr 17, 2019
e130d25
fix vsix dependency version calculations (#6565)
brettfo Apr 17, 2019
290fd3c
Update dependencies from https://github.com/dotnet/arcade build 20190…
dotnet-maestro[bot] Apr 17, 2019
d4e68ae
Merge pull request #6567 from Microsoft/merges/master-to-dev16.1
Apr 18, 2019
983e162
Update dependencies from https://github.com/dotnet/arcade build 20190…
dotnet-maestro[bot] Apr 18, 2019
b818aa0
Fixed benchmark solution and added project type check test (#6566)
TIHan Apr 18, 2019
95f733d
cleanup fcs props (#6538)
dsyme Apr 18, 2019
46bb153
Merge pull request #6573 from Microsoft/merges/master-to-dev16.1
Apr 19, 2019
0fadd9e
rearrange order of SWR files to fix dependencies (#6582)
brettfo Apr 19, 2019
3ab3687
Merge pull request #6584 from Microsoft/master
brettfo Apr 19, 2019
c4c1d9c
combine swr files (#6587)
brettfo Apr 19, 2019
d1cc85e
Merge pull request #6588 from Microsoft/master
brettfo Apr 19, 2019
69539f2
hard-code FSharp.Core that ships with legacy project templates (#6611)
brettfo Apr 22, 2019
a5510fb
Roslyn Shim - First Phase (#6498)
TIHan Apr 23, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fixed benchmark solution and added project type check test (#6566)
* Trying to build benchmarks

* Benchmark testing 100 referenced projects in the compiler service

* Fixed project reference bit

* Change stamp

* Fixed build
  • Loading branch information
TIHan authored and KevinRansom committed Apr 18, 2019
commit b818aa0843f9923b5bab5d6f60018d3224733150
151 changes: 134 additions & 17 deletions benchmarks/CompilerServiceBenchmarks/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ open FSharp.Compiler.Text
open FSharp.Compiler.AbstractIL
open FSharp.Compiler.AbstractIL.IL
open FSharp.Compiler.AbstractIL.ILBinaryReader
open CodeAnalysis.Text
open Microsoft.CodeAnalysis.Text
open BenchmarkDotNet.Attributes
open BenchmarkDotNet.Running

Expand Down Expand Up @@ -80,6 +80,49 @@ type SourceText with
member this.ToFSharpSourceText() =
SourceText.weakTable.GetValue(this, Runtime.CompilerServices.ConditionalWeakTable<_,_>.CreateValueCallback(SourceText.create))

[<AutoOpen>]
module Helpers =

let createProject name referencedProjects =
let tmpPath = Path.GetTempPath()
let file = Path.Combine(tmpPath, Path.ChangeExtension(name, ".fs"))
{
ProjectFileName = Path.Combine(tmpPath, Path.ChangeExtension(name, ".dll"))
ProjectId = None
SourceFiles = [|file|]
OtherOptions =
Array.append [|"--optimize+"; "--target:library" |] (referencedProjects |> Array.ofList |> Array.map (fun x -> "-r:" + x.ProjectFileName))
ReferencedProjects =
referencedProjects
|> List.map (fun x -> (x.ProjectFileName, x))
|> Array.ofList
IsIncompleteTypeCheckEnvironment = false
UseScriptResolutionRules = false
LoadTime = DateTime()
UnresolvedReferences = None
OriginalLoadReferences = []
ExtraProjectInfo = None
Stamp = Some 0L (* set the stamp to 0L on each run so we don't evaluate the whole project again *)
}

let generateSourceCode moduleName =
sprintf """
module Benchmark.%s

type %s =

val X : int

val Y : int

val Z : int

let function%s (x: %s) =
let x = 1
let y = 2
let z = x + y
z""" moduleName moduleName moduleName moduleName

[<MemoryDiagnoser>]
type CompilerService() =

Expand Down Expand Up @@ -112,7 +155,7 @@ type CompilerService() =
[<GlobalSetup>]
member __.Setup() =
match checkerOpt with
| None -> checkerOpt <- Some(FSharpChecker.Create())
| None -> checkerOpt <- Some(FSharpChecker.Create(projectCacheSize = 200))
| _ -> ()

match sourceOpt with
Expand All @@ -127,30 +170,25 @@ type CompilerService() =
|> Array.map (fun x -> (x.Location))
|> Some
| _ -> ()

[<IterationSetup(Target = "Parsing")>]
member __.ParsingSetup() =
match checkerOpt with
| None -> failwith "no checker"
| Some(checker) ->
checker.InvalidateAll()
checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients()
checker.ParseFile("dummy.fs", SourceText.ofString "dummy", parsingOptions) |> Async.RunSynchronously |> ignore

[<Benchmark>]
member __.Parsing() =
member __.ParsingTypeCheckerFs() =
match checkerOpt, sourceOpt with
| None, _ -> failwith "no checker"
| _, None -> failwith "no source"
| Some(checker), Some(source) ->
let results = checker.ParseFile("TypeChecker.fs", source.ToFSharpSourceText(), parsingOptions) |> Async.RunSynchronously
if results.ParseHadErrors then failwithf "parse had errors: %A" results.Errors

[<IterationSetup(Target = "ILReading")>]
member __.ILReadingSetup() =
// With caching, performance increases an order of magnitude when re-reading an ILModuleReader.
// Clear it for benchmarking.
ClearAllILModuleReaderCache()
[<IterationCleanup(Target = "ParsingTypeCheckerFs")>]
member __.ParsingTypeCheckerFsSetup() =
match checkerOpt with
| None -> failwith "no checker"
| Some(checker) ->
checker.InvalidateAll()
checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients()
checker.ParseFile("dummy.fs", SourceText.ofString "dummy", parsingOptions) |> Async.RunSynchronously |> ignore
ClearAllILModuleReaderCache()

[<Benchmark>]
member __.ILReading() =
Expand Down Expand Up @@ -198,6 +236,85 @@ type CompilerService() =
)
)

[<IterationCleanup(Target = "ILReading")>]
member __.ILReadingSetup() =
// With caching, performance increases an order of magnitude when re-reading an ILModuleReader.
// Clear it for benchmarking.
ClearAllILModuleReaderCache()

member val TypeCheckFileWith100ReferencedProjectsOptions =
createProject "MainProject"
[ for i = 1 to 100 do
yield
createProject ("ReferencedProject" + string i) []
]

member this.TypeCheckFileWith100ReferencedProjectsRun() =
let options = this.TypeCheckFileWith100ReferencedProjectsOptions
let file = options.SourceFiles.[0]

match checkerOpt with
| None -> failwith "no checker"
| Some checker ->
let parseResult, checkResult =
checker.ParseAndCheckFileInProject(file, 0, SourceText.ofString (File.ReadAllText(file)), options)
|> Async.RunSynchronously

if parseResult.Errors.Length > 0 then
failwithf "%A" parseResult.Errors

match checkResult with
| FSharpCheckFileAnswer.Aborted -> failwith "aborted"
| FSharpCheckFileAnswer.Succeeded checkFileResult ->

if checkFileResult.Errors.Length > 0 then
failwithf "%A" checkFileResult.Errors

[<IterationSetup(Target = "TypeCheckFileWith100ReferencedProjects")>]
member this.TypeCheckFileWith100ReferencedProjectsSetup() =
this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles
|> Seq.iter (fun file ->
File.WriteAllText(file, generateSourceCode (Path.GetFileNameWithoutExtension(file)))
)

this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects
|> Seq.iter (fun (_, referencedProjectOptions) ->
referencedProjectOptions.SourceFiles
|> Seq.iter (fun file ->
File.WriteAllText(file, generateSourceCode (Path.GetFileNameWithoutExtension(file)))
)
)

this.TypeCheckFileWith100ReferencedProjectsRun()

[<Benchmark>]
member this.TypeCheckFileWith100ReferencedProjects() =
// Because the checker's projectcachesize is set to 200, this should be fast.
// If set to 3, it will be almost as slow as re-evaluating all project and it's projects references on setup; this could be a bug or not what we want.
this.TypeCheckFileWith100ReferencedProjectsRun()

[<IterationCleanup(Target = "TypeCheckFileWith100ReferencedProjects")>]
member this.TypeCheckFileWith100ReferencedProjectsCleanup() =
this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles
|> Seq.iter (fun file ->
try File.Delete(file) with | _ -> ()
)

this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects
|> Seq.iter (fun (_, referencedProjectOptions) ->
referencedProjectOptions.SourceFiles
|> Seq.iter (fun file ->
try File.Delete(file) with | _ -> ()
)
)

match checkerOpt with
| None -> failwith "no checker"
| Some(checker) ->
checker.InvalidateAll()
checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients()
ClearAllILModuleReaderCache()

[<EntryPoint>]
let main argv =
let _ = BenchmarkRunner.Run<CompilerService>()
Expand Down
3 changes: 0 additions & 3 deletions benchmarks/Directory.Build.props

This file was deleted.

3 changes: 0 additions & 3 deletions benchmarks/Directory.Build.targets

This file was deleted.