From bbd7d488a5a2b55aa9ef9c6ff14d0e0c0fc5dc19 Mon Sep 17 00:00:00 2001 From: Turnerj Date: Tue, 1 Jan 2019 21:06:03 +1030 Subject: [PATCH 1/2] Initial benchmark for basic site --- InfinityCrawler.sln | 11 ++++- .../BasicSiteCrawlBenchmark.cs | 46 +++++++++++++++++++ .../InfinityCrawler.Tests.Benchmarks.csproj | 18 ++++++++ .../Program.cs | 13 ++++++ 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs create mode 100644 tests/InfinityCrawler.Tests.Benchmarks/InfinityCrawler.Tests.Benchmarks.csproj create mode 100644 tests/InfinityCrawler.Tests.Benchmarks/Program.cs diff --git a/InfinityCrawler.sln b/InfinityCrawler.sln index 9c6c818..76ccf01 100644 --- a/InfinityCrawler.sln +++ b/InfinityCrawler.sln @@ -21,9 +21,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{46BF0980 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfinityCrawler", "src\InfinityCrawler\InfinityCrawler.csproj", "{90361E0D-CB4C-4BCC-AAF2-70DAF87D5565}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfinityCrawler.Tests", "tests\InfinityCrawler.Tests\InfinityCrawler.Tests.csproj", "{F30AF2A4-C53F-40FE-8083-6A82C0583255}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfinityCrawler.Tests", "tests\InfinityCrawler.Tests\InfinityCrawler.Tests.csproj", "{F30AF2A4-C53F-40FE-8083-6A82C0583255}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfinityCrawler.Tests.TestSite", "tests\InfinityCrawler.Tests.TestSite\InfinityCrawler.Tests.TestSite.csproj", "{483B6FC9-98E7-4BD4-BA09-80DF504E31B2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfinityCrawler.Tests.TestSite", "tests\InfinityCrawler.Tests.TestSite\InfinityCrawler.Tests.TestSite.csproj", "{483B6FC9-98E7-4BD4-BA09-80DF504E31B2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfinityCrawler.Tests.Benchmarks", "tests\InfinityCrawler.Tests.Benchmarks\InfinityCrawler.Tests.Benchmarks.csproj", "{F17C5CAC-DF32-434B-A4C5-21CBDDA86B97}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -43,6 +45,10 @@ Global {483B6FC9-98E7-4BD4-BA09-80DF504E31B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {483B6FC9-98E7-4BD4-BA09-80DF504E31B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {483B6FC9-98E7-4BD4-BA09-80DF504E31B2}.Release|Any CPU.Build.0 = Release|Any CPU + {F17C5CAC-DF32-434B-A4C5-21CBDDA86B97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F17C5CAC-DF32-434B-A4C5-21CBDDA86B97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F17C5CAC-DF32-434B-A4C5-21CBDDA86B97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F17C5CAC-DF32-434B-A4C5-21CBDDA86B97}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -51,6 +57,7 @@ Global {90361E0D-CB4C-4BCC-AAF2-70DAF87D5565} = {C6187826-9F4B-4E85-90D1-BC46A0F7F8F1} {F30AF2A4-C53F-40FE-8083-6A82C0583255} = {46BF0980-A8A4-492E-8652-0725ADB6A683} {483B6FC9-98E7-4BD4-BA09-80DF504E31B2} = {46BF0980-A8A4-492E-8652-0725ADB6A683} + {F17C5CAC-DF32-434B-A4C5-21CBDDA86B97} = {46BF0980-A8A4-492E-8652-0725ADB6A683} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FC9AB8BE-670B-4F26-9F17-73D2C0DECA6A} diff --git a/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs b/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs new file mode 100644 index 0000000..c474272 --- /dev/null +++ b/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using InfinityCrawler.TaskHandlers; +using InfinityCrawler.Tests.TestSite; + +namespace InfinityCrawler.Tests.Benchmarks +{ + [CoreJob, ClrJob(baseline: true)] + [MemoryDiagnoser] + public class BasicSiteCrawlBenchmark + { + private TestSiteManager TestSite { get; } + private Crawler Crawler { get; } + private Uri Uri { get; } = new Uri("http://localhost/"); + + public BasicSiteCrawlBenchmark() + { + TestSite = new TestSiteManager(new SiteContext + { + SiteFolder = "BasicSite" + }); + + var client = TestSite.GetHttpClient(); + Crawler = new Crawler(client, new ParallelAsyncTaskHandler()); + } + + [Benchmark] + public async Task CrawlSite() + { + var result = await Crawler.Crawl(Uri, new CrawlSettings + { + TaskHandlerOptions = new TaskHandlerOptions + { + MaxNumberOfSimultaneousTasks = 5, + DelayBetweenTaskStart = new TimeSpan(), + DelayJitter = new TimeSpan(), + TimeoutBeforeThrottle = new TimeSpan() + } + }); + } + } +} diff --git a/tests/InfinityCrawler.Tests.Benchmarks/InfinityCrawler.Tests.Benchmarks.csproj b/tests/InfinityCrawler.Tests.Benchmarks/InfinityCrawler.Tests.Benchmarks.csproj new file mode 100644 index 0000000..62ffb04 --- /dev/null +++ b/tests/InfinityCrawler.Tests.Benchmarks/InfinityCrawler.Tests.Benchmarks.csproj @@ -0,0 +1,18 @@ + + + + Exe + netcoreapp2.1;net461 + false + + + + + + + + + + + + diff --git a/tests/InfinityCrawler.Tests.Benchmarks/Program.cs b/tests/InfinityCrawler.Tests.Benchmarks/Program.cs new file mode 100644 index 0000000..f9c7667 --- /dev/null +++ b/tests/InfinityCrawler.Tests.Benchmarks/Program.cs @@ -0,0 +1,13 @@ +using System; +using BenchmarkDotNet.Running; + +namespace InfinityCrawler.Tests.Benchmarks +{ + class Program + { + static void Main(string[] args) + { + BenchmarkRunner.Run(); + } + } +} From d4728bd32c51f939ad4a609341ec49a9069c7e48 Mon Sep 17 00:00:00 2001 From: Turnerj Date: Thu, 3 Jan 2019 22:48:36 +1030 Subject: [PATCH 2/2] Added workaround for benchmarking ops issue Need to perform a warmup so the workload jitting doesn't take too long https://github.com/dotnet/BenchmarkDotNet/issues/837 --- .../BasicSiteCrawlBenchmark.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs b/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs index c474272..84096e4 100644 --- a/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs +++ b/tests/InfinityCrawler.Tests.Benchmarks/BasicSiteCrawlBenchmark.cs @@ -28,6 +28,12 @@ public BasicSiteCrawlBenchmark() Crawler = new Crawler(client, new ParallelAsyncTaskHandler()); } + [GlobalSetup] + public async Task Setup() + { + await CrawlSite(); // benchmark warmup as a workaround for https://github.com/dotnet/BenchmarkDotNet/issues/837 + } + [Benchmark] public async Task CrawlSite() {