2016-04-22 17:06:55 -07:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Linq ;
using Microsoft.DotNet.Tools.Test.Utilities ;
2016-04-26 09:10:28 -07:00
using Microsoft.Xunit.Performance ;
using Microsoft.DotNet.TestFramework ;
2016-04-27 08:44:12 -07:00
using System.IO ;
using System.Runtime.CompilerServices ;
using System ;
using System.Collections.Generic ;
2016-04-22 17:06:55 -07:00
namespace Microsoft.DotNet.Tools.Builder.Tests
{
2016-04-27 08:44:12 -07:00
public class BuildPerformanceTest : TestBase
2016-04-22 17:06:55 -07:00
{
2016-04-26 09:10:28 -07:00
private static string SingleTargetApp = "SingleTargetApp" ;
private static string TwoTargetApp = "TwoTargetApp" ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
private static string [ ] SingleTargetGraph = new [ ]
2016-04-22 17:06:55 -07:00
{
2016-04-26 09:10:28 -07:00
"SingleTargetGraph/SingleTargetP0" ,
"SingleTargetGraph/SingleTargetP1" ,
"SingleTargetGraph/SingleTargetP2"
} ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
private static string [ ] TwoTargetGraph = new [ ]
2016-04-22 17:06:55 -07:00
{
2016-04-26 09:10:28 -07:00
"TwoTargetGraph/TwoTargetP0" ,
"TwoTargetGraph/TwoTargetP1" ,
"TwoTargetGraph/TwoTargetP2"
} ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
private static string [ ] TwoTargetGraphLarge = new [ ]
{
"TwoTargetGraphLarge/TwoTargetLargeP0" ,
"TwoTargetGraphLarge/TwoTargetLargeP1" ,
"TwoTargetGraphLarge/TwoTargetLargeP2" ,
"TwoTargetGraphLarge/TwoTargetLargeP3" ,
"TwoTargetGraphLarge/TwoTargetLargeP4" ,
"TwoTargetGraphLarge/TwoTargetLargeP5" ,
"TwoTargetGraphLarge/TwoTargetLargeP6"
} ;
[Benchmark]
public void BuildSingleProject_SingleTargetApp ( ) = > BuildSingleProject ( CreateTestInstance ( SingleTargetApp ) ) ;
[Benchmark]
public void BuildSingleProject_TwoTargetApp ( ) = > BuildSingleProject ( CreateTestInstance ( TwoTargetApp ) ) ;
public void BuildSingleProject ( TestInstance instance )
{
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-27 08:44:12 -07:00
TouchSource ( instance . TestRoot ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void IncrementalSkipSingleProject_SingleTargetApp ( ) = > IncrementalSkipSingleProject ( CreateTestInstance ( SingleTargetApp ) ) ;
[Benchmark]
public void IncrementalSkipSingleProject_TwoTargetApp ( ) = > IncrementalSkipSingleProject ( CreateTestInstance ( TwoTargetApp ) ) ;
public void IncrementalSkipSingleProject ( TestInstance instance )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
new BuildCommand ( instance . TestRoot , buildProfile : false )
. Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void BuildAllInGraph_SingleTargetGraph ( ) = > BuildAllInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
[Benchmark]
public void BuildAllInGraph_TwoTargetGraph ( ) = > BuildAllInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void BuildAllInGraph_TwoTargetGraphLarge ( ) = > BuildAllInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
public void BuildAllInGraph ( TestInstance [ ] instances )
2016-04-22 17:06:55 -07:00
{
var instance = instances [ 0 ] ;
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
foreach ( var i in instances )
{
2016-04-27 08:44:12 -07:00
TouchSource ( i . TestRoot ) ;
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void IncrementalSkipAllInGraph_SingleTargetGraph ( ) = >
IncrementalSkipAllInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
[Benchmark]
public void IncrementalSkipAllInGraph_TwoTargetGraph ( ) = >
IncrementalSkipAllInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void IncrementalSkipAllInGraphh_TwoTargetGraphLarge ( ) = >
IncrementalSkipAllInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
public void IncrementalSkipAllInGraph ( TestInstance [ ] instances )
2016-04-22 17:06:55 -07:00
{
var instance = instances [ 0 ] ;
2016-04-27 08:44:12 -07:00
new BuildCommand ( instance . TestRoot , buildProfile : false )
. Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void IncrementalRebuildWithRootChangedInGraph_SingleTargetGraph ( ) = >
IncrementalRebuildWithRootChangedInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
[Benchmark]
public void IncrementalRebuildWithRootChangedInGraph_TwoTargetGraph ( ) = >
IncrementalRebuildWithRootChangedInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void IncrementalRebuildWithRootChangedInGraph_TwoTargetGraphLarge ( ) = >
IncrementalRebuildWithRootChangedInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
public void IncrementalRebuildWithRootChangedInGraph ( TestInstance [ ] instances )
2016-04-22 17:06:55 -07:00
{
var instance = instances [ 0 ] ;
2016-04-27 08:44:12 -07:00
new BuildCommand ( instance . TestRoot , buildProfile : false )
. Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-27 08:44:12 -07:00
TouchSource ( instance . TestRoot ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void IncrementalRebuildWithLastChangedInGraph_SingleTargetGraph ( ) = >
IncrementalRebuildWithLastChangedInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
[Benchmark]
public void IncrementalRebuildWithLastChangedInGraph_TwoTargetGraph ( ) = >
IncrementalRebuildWithLastChangedInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void IncrementalRebuildWithLastChangedInGraph_TwoTargetGraphLarge ( ) = >
IncrementalRebuildWithLastChangedInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
public void IncrementalRebuildWithLastChangedInGraph ( TestInstance [ ] instances )
2016-04-22 17:06:55 -07:00
{
var instance = instances [ 0 ] ;
2016-04-27 08:44:12 -07:00
new BuildCommand ( instance . TestRoot , buildProfile : false )
. Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var buildCommand = new BuildCommand ( instance . TestRoot , buildProfile : false ) ;
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-27 08:44:12 -07:00
TouchSource ( instances . Last ( ) . TestRoot ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
public void IncrementalSkipAllNoDependenciesInGraph_SingleTargetGraph ( ) = >
IncrementalSkipAllNoDependenciesInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
[Benchmark]
public void IncrementalSkipAllNoDependenciesInGraph_TwoTargetGraph ( ) = >
IncrementalSkipAllNoDependenciesInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void IncrementalSkipAllNoDependenciesInGraph_TwoTargetGraphLarge ( ) = >
IncrementalSkipAllNoDependenciesInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
public void IncrementalSkipAllNoDependenciesInGraph ( TestInstance [ ] instances )
2016-04-22 17:06:55 -07:00
{
var instance = instances [ 0 ] ;
2016-04-27 08:44:12 -07:00
new BuildCommand ( instance . TestRoot , buildProfile : false )
. Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var commands = new List < BuildCommand > ( ) ;
foreach ( var i in instances . Reverse ( ) )
{
commands . Add ( new BuildCommand ( i . TestRoot ,
framework : DefaultFramework ,
noDependencies : true ,
buildProfile : false ) ) ;
}
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
foreach ( var buildCommand in commands )
2016-04-26 09:10:28 -07:00
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
[Benchmark]
2016-04-27 08:44:12 -07:00
public void BuildAllNoDependenciesInGraph_SingleTargetGraph ( ) = >
2016-04-26 09:10:28 -07:00
BuildAllNoDependenciesInGraph ( CreateTestInstances ( SingleTargetGraph ) ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
[Benchmark]
public void BuildAllNoDependenciesInGraph_TwoTargetGraph ( ) = >
BuildAllNoDependenciesInGraph ( CreateTestInstances ( TwoTargetGraph ) ) ;
[Benchmark]
public void BuildAllNoDependenciesInGraph_TwoTargetGraphLarge ( ) = >
BuildAllNoDependenciesInGraph ( CreateTestInstances ( TwoTargetGraphLarge ) ) ;
2016-04-22 17:06:55 -07:00
2016-04-26 09:10:28 -07:00
public void BuildAllNoDependenciesInGraph ( TestInstance [ ] instances )
{
foreach ( var iteration in Benchmark . Iterations )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
var commands = new List < BuildCommand > ( ) ;
foreach ( var i in instances . Reverse ( ) )
{
commands . Add ( new BuildCommand ( i . TestRoot ,
framework : DefaultFramework ,
noDependencies : true ,
buildProfile : false ) ) ;
}
2016-04-26 09:10:28 -07:00
using ( iteration . StartMeasurement ( ) )
2016-04-22 17:06:55 -07:00
{
2016-04-27 08:44:12 -07:00
foreach ( var buildCommand in commands )
2016-04-26 09:10:28 -07:00
{
2016-04-27 08:44:12 -07:00
buildCommand . Execute ( ) . Should ( ) . Pass ( ) ;
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
foreach ( var instance in instances )
{
2016-04-27 08:44:12 -07:00
TouchSource ( instance . TestRoot ) ;
2016-04-22 17:06:55 -07:00
}
2016-04-26 09:10:28 -07:00
}
2016-04-22 17:06:55 -07:00
}
2016-04-27 08:44:12 -07:00
protected void TouchSource ( string project )
{
var sourceFile = Directory . GetFiles ( project , "*.cs" ) . FirstOrDefault ( ) ;
if ( sourceFile = = null )
{
throw new InvalidOperationException ( $"'.cs' files not found in {project}" ) ;
}
File . SetLastWriteTime ( sourceFile , DateTime . Now ) ;
}
protected TestInstance [ ] CreateTestInstances ( string [ ] testProjectNames , [ CallerMemberName ] string callingMethod = "" )
{
return testProjectNames . Select ( testProjectName = >
{
return CreateTestInstance ( testProjectName , callingMethod ) ;
} ) . ToArray ( ) ;
}
protected TestInstance CreateTestInstance ( string testProjectName , [ CallerMemberName ] string callingMethod = "" )
{
return TestAssetsManager . CreateTestInstance ( Path . Combine ( "PerformanceTestProjects" , testProjectName ) , callingMethod )
. WithLockFiles ( ) ;
}
2016-04-22 17:06:55 -07:00
}
}