From 0255f422101cb9edfdbb55c05ecad48a5a92429b Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 15 Jul 2020 14:29:23 +1000 Subject: [PATCH 1/9] Adds simple benchmark between nuget versions --- Lucene.Net.sln | 5 + .../HomePageScriptBenchmarks.cs | 112 ++++++++++++++++++ .../Lucene.Net.Tests.BenchmarkDotNet.csproj | 17 +++ .../Program.cs | 26 ++++ 4 files changed, 160 insertions(+) create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/Program.cs diff --git a/Lucene.Net.sln b/Lucene.Net.sln index 24547c23da..0e96e1adad 100644 --- a/Lucene.Net.sln +++ b/Lucene.Net.sln @@ -210,6 +210,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{4D0ED7D9 src\dotnet\Lucene.Net.CodeAnalysis\tools\install.ps1 = src\dotnet\Lucene.Net.CodeAnalysis\tools\install.ps1 src\dotnet\Lucene.Net.CodeAnalysis\tools\uninstall.ps1 = src\dotnet\Lucene.Net.CodeAnalysis\tools\uninstall.ps1 EndProjectSection +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lucene.Net.Tests.BenchmarkDotNet", "src\Lucene.Net.Tests.BenchmarkDotNet\Lucene.Net.Tests.BenchmarkDotNet.csproj", "{0C476146-411E-4C94-8A59-726A5F982A89}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -477,6 +478,10 @@ Global {5CD4D4E8-6132-4384-98FC-6AB1C97E0B80}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CD4D4E8-6132-4384-98FC-6AB1C97E0B80}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CD4D4E8-6132-4384-98FC-6AB1C97E0B80}.Release|Any CPU.Build.0 = Release|Any CPU + {0C476146-411E-4C94-8A59-726A5F982A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C476146-411E-4C94-8A59-726A5F982A89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C476146-411E-4C94-8A59-726A5F982A89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C476146-411E-4C94-8A59-726A5F982A89}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs new file mode 100644 index 0000000000..37ac4b2096 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs @@ -0,0 +1,112 @@ +using System; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Util; +using Lucene.Net.Store; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Index; +using Lucene.Net.Documents; +using Lucene.Net.Search; +using System.Diagnostics; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class HomePageScriptBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + } + } + + private const int _directoryWriterIterations = 10; + private const int _indexSearchIterations = 25; + + [Benchmark] + public void HomePageScript() + { + // Ensures index backwards compatibility + var AppLuceneVersion = LuceneVersion.LUCENE_48; + + for (int d = 0; d < _directoryWriterIterations; d++) + { + using var dir = new RAMDirectory(); + + //create an analyzer to process the text + var analyzer = new StandardAnalyzer(AppLuceneVersion); + + //create an index writer + var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer); + using var writer = new IndexWriter(dir, indexConfig); + + for (int i = 0; i < _indexSearchIterations; i++) + { + var source = new + { + Name = $"Kermit{i} the Frog{i}", + FavoritePhrase = $"The quick{i} brown{i} fox{i} jumps{i} over{i} the lazy{i} dog{i} " + }; + Document doc = new Document + { + // StringField indexes but doesn't tokenize + new StringField("name", source.Name, Field.Store.YES), + new TextField("favoritePhrase", source.FavoritePhrase, Field.Store.YES) + }; + + writer.AddDocument(doc); + writer.Flush(triggerMerge: false, applyAllDeletes: false); + } + + for (int i = 0; i < _indexSearchIterations; i++) + { + // search with a phrase + var phrase = new MultiPhraseQuery + { + new Term("favoritePhrase", $"brown{i}"), + new Term("favoritePhrase", $"fox{i}") + }; + + // re-use the writer to get real-time updates + using var reader = writer.GetReader(applyAllDeletes: true); + var searcher = new IndexSearcher(reader); + var hits = searcher.Search(phrase, 20 /* top 20 */).ScoreDocs; + Debug.Assert(hits.Length > 0); + foreach (var hit in hits) + { + var foundDoc = searcher.Doc(hit.Doc); + var score = hit.Score; + var name = foundDoc.Get("name"); + var favoritePhrase = foundDoc.Get("favoritePhrase"); + } + } + } + } + + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj new file mode 100644 index 0000000000..5d4af5aea7 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj @@ -0,0 +1,17 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + + + + diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Program.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/Program.cs new file mode 100644 index 0000000000..c65ec225c1 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Program.cs @@ -0,0 +1,26 @@ +using BenchmarkDotNet.Running; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + class Program + { + private static void Main(string[] args) => new BenchmarkSwitcher(typeof(Program).Assembly).Run(args); + } +} From a7b463bb879b7d4e2e2bcb147ecd1604a0ed6a25 Mon Sep 17 00:00:00 2001 From: Shad Storhaug Date: Mon, 20 Jul 2020 17:48:10 +0700 Subject: [PATCH 2/9] Lucene.Net.Tests.BenchmarkDotNet: Updated HomePageScripBenchmarks to include beta 5, beta 6, and beta 10 --- .../HomePageScriptBenchmarks.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs index 37ac4b2096..6abebbd970 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs @@ -39,9 +39,12 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithId("4.8.0-beta00008")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithId("4.8.0-beta00005")); } } From 47495915d6889ae672c17093716a6f3ceeff91e4 Mon Sep 17 00:00:00 2001 From: Shad Storhaug Date: Mon, 20 Jul 2020 17:51:21 +0700 Subject: [PATCH 3/9] Lucene.Net.Tests.BenchmarkDotNet: Added benchmarks for IndexFiles and SearchFiles --- .../IndexFilesBenchmarks.cs | 231 ++++++++++++++++++ .../Lucene.Net.Tests.BenchmarkDotNet.csproj | 7 + .../SearchFilesBenchmarks.cs | 128 ++++++++++ .../Util/ContentGenerator.cs | 110 +++++++++ .../Util/PathUtil.cs | 64 +++++ 5 files changed, 540 insertions(+) create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/Util/ContentGenerator.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/Util/PathUtil.cs diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs new file mode 100644 index 0000000000..3a9119e4f6 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs @@ -0,0 +1,231 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Documents; +using Lucene.Net.Index; +using Lucene.Net.Randomized.Generators; +using Lucene.Net.Store; +using Lucene.Net.Tests.BenchmarkDotNet.Util; +using Lucene.Net.Util; +using System; +using System.IO; +using System.Text; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class IndexFilesBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + private static DirectoryInfo sourceDirectory; + private static DirectoryInfo indexDirectory; + + [GlobalSetup] + public void GlobalSetUp() + { + sourceDirectory = PathUtil.CreateTempDir("sourceFiles"); + int seed = 2342; + ContentGenerator.GenerateFiles(new Random(seed), sourceDirectory.FullName, 250); + } + + [GlobalCleanup] + public void GlobalTearDown() + { + try + { + if (System.IO.Directory.Exists(sourceDirectory.FullName)) + System.IO.Directory.Delete(sourceDirectory.FullName, recursive: true); + } + catch { } + } + + [IterationSetup] + public void IterationSetUp() + { + indexDirectory = PathUtil.CreateTempDir("indexFiles"); + } + + [IterationCleanup] + public void IterationTearDown() + { + try + { + if (System.IO.Directory.Exists(indexDirectory.FullName)) + System.IO.Directory.Delete(indexDirectory.FullName, recursive: true); + } + catch { } + + } + + /// Index all text files under a directory. + [Benchmark] + public void IndexFiles() => IndexFiles(sourceDirectory, indexDirectory); + + /// Index all text files under a directory. + public static void IndexFiles(DirectoryInfo sourceDirectory, DirectoryInfo indexDirectory) + { + string indexPath = indexDirectory.FullName; + + bool create = true; + + Store.Directory dir = FSDirectory.Open(indexPath); + // :Post-Release-Update-Version.LUCENE_XY: + Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); + IndexWriterConfig iwc = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer); + + if (create) + { + // Create a new index in the directory, removing any + // previously indexed documents: + iwc.OpenMode = OpenMode.CREATE; + } + else + { + // Add new documents to an existing index: + iwc.OpenMode = OpenMode.CREATE_OR_APPEND; + } + + // Optional: for better indexing performance, if you + // are indexing many documents, increase the RAM + // buffer. + // + // iwc.RAMBufferSizeMB = 256.0; + + using (IndexWriter writer = new IndexWriter(dir, iwc)) + { + IndexDocs(writer, sourceDirectory); + + // NOTE: if you want to maximize search performance, + // you can optionally call forceMerge here. This can be + // a terribly costly operation, so generally it's only + // worth it when your index is relatively static (ie + // you're done adding documents to it): + // + // writer.ForceMerge(1); + } + } + + /// + /// Recurses over files and directories found under the + /// given directory and indexes each file. + /// + /// NOTE: This method indexes one document per input file. + /// This is slow. For good throughput, put multiple documents + /// into your input file(s). + /// + /// + /// to the index where the given + /// file/dir info will be stored + /// + /// + /// The directory to recurse into to find files to index. + /// + /// + /// If there is a low-level I/O error. + /// + internal static void IndexDocs(IndexWriter writer, DirectoryInfo directoryInfo) + { + foreach (var dirInfo in directoryInfo.GetDirectories()) + { + IndexDocs(writer, dirInfo); + } + foreach (var fileInfo in directoryInfo.GetFiles()) + { + IndexDocs(writer, fileInfo); + } + } + + /// + /// Indexes the given file using the given writer. + /// + /// + /// to the index where the given + /// file info will be stored. + /// + /// + /// The file to index. + /// + /// + /// If there is a low-level I/O error. + /// + internal static void IndexDocs(IndexWriter writer, FileInfo file) + { + using (FileStream fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) + { + // make a new, empty document + Document doc = new Document(); + + // Add the path of the file as a field named "path". Use a + // field that is indexed (i.e. searchable), but don't tokenize + // the field into separate words and don't index term frequency + // or positional information: + Field pathField = new StringField("path", file.FullName, Field.Store.YES); + doc.Add(pathField); + + // Add the last modified date of the file a field named "modified". + // Use a LongField that is indexed (i.e. efficiently filterable with + // NumericRangeFilter). This indexes to milli-second resolution, which + // is often too fine. You could instead create a number based on + // year/month/day/hour/minutes/seconds, down the resolution you require. + // For example the long value 2011021714 would mean + // February 17, 2011, 2-3 PM. + doc.Add(new Int64Field("modified", file.LastWriteTimeUtc.Ticks, Field.Store.NO)); + + // Add the contents of the file to a field named "contents". Specify a Reader, + // so that the text of the file is tokenized and indexed, but not stored. + // Note that FileReader expects the file to be in UTF-8 encoding. + // If that's not the case searching for special characters will fail. + doc.Add(new TextField("contents", new StreamReader(fs, Encoding.UTF8))); + + if (writer.Config.OpenMode == OpenMode.CREATE) + { + // New index, so we just add the document (no old document can be there): + //Console.WriteLine("adding " + file); + writer.AddDocument(doc); + } + else + { + // Existing index (an old copy of this document may have been indexed) so + // we use updateDocument instead to replace the old one matching the exact + // path, if present: + //Console.WriteLine("updating " + file); + writer.UpdateDocument(new Term("path", file.FullName), doc); + } + } + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj index 5d4af5aea7..781c6613ec 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj @@ -12,6 +12,13 @@ + + + + + + + diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs new file mode 100644 index 0000000000..3c2c45a338 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs @@ -0,0 +1,128 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Index; +using Lucene.Net.QueryParsers.Classic; +using Lucene.Net.Randomized.Generators; +using Lucene.Net.Search; +using Lucene.Net.Store; +using Lucene.Net.Tests.BenchmarkDotNet.Util; +using Lucene.Net.Util; +using System; +using System.IO; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class SearchFilesBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + private const string QueryString = "settings"; + private static DirectoryInfo indexDirectory; + + [GlobalSetup] + public void GlobalSetUp() + { + var sourceDirectory = PathUtil.CreateTempDir("sourceFiles"); + + // Generate content to index (including our string that we will search for) + int seed = 2342; + ContentGenerator.GenerateFiles(new Random(seed), sourceDirectory.FullName, 1000, QueryString); + + + // Index the content + indexDirectory = PathUtil.CreateTempDir("indexFiles"); + IndexFilesBenchmarks.IndexFiles(sourceDirectory, indexDirectory); + + // Cleanup our source files, they are no longer needed + try + { + if (System.IO.Directory.Exists(sourceDirectory.FullName)) + System.IO.Directory.Delete(sourceDirectory.FullName, recursive: true); + } + catch { } + } + + [GlobalCleanup] + public void GlobalTearDown() + { + try + { + if (System.IO.Directory.Exists(indexDirectory.FullName)) + System.IO.Directory.Delete(indexDirectory.FullName, recursive: true); + } + catch { } + } + + [Benchmark] + public void SearchFiles() + { + + string index = indexDirectory.FullName; + string field = "contents"; + //string queries = null; + int repeat = 1000; + //bool raw = false; + string queryString = QueryString; + //int hitsPerPage = 10; + + using (IndexReader reader = DirectoryReader.Open(FSDirectory.Open(index))) + { + IndexSearcher searcher = new IndexSearcher(reader); + // :Post-Release-Update-Version.LUCENE_XY: + Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); + + // :Post-Release-Update-Version.LUCENE_XY: + QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, field, analyzer); + + Query query = parser.Parse(queryString.Trim()); + //Console.WriteLine("Searching for: " + query.ToString(field)); + + // repeat & time as benchmark + { + //DateTime start = DateTime.UtcNow; + for (int i = 0; i < repeat; i++) + { + searcher.Search(query, null, 100); + } + //DateTime end = DateTime.UtcNow; + //Console.WriteLine("Time: " + (end - start).TotalMilliseconds + "ms"); + } + } // Disposes reader + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Util/ContentGenerator.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/Util/ContentGenerator.cs new file mode 100644 index 0000000000..15612e9229 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Util/ContentGenerator.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Lucene.Net.Randomized.Generators +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + public static class ContentGenerator + { + public static void GenerateFiles(Random random, string directory, int numberOfFiles, params string[] stringsToQuery) + { + var subdirectories = new HashSet(); + for (int i = 0; i < numberOfFiles; i++) + { + bool root = random.Next(1, 100) > 50; + + if (root) + { + GenerateFile(random, directory, stringsToQuery); + } + else + { + string subdirectory; + if (subdirectories.Count > 0 && random.Next(1, 100) > 30) + { + subdirectory = RandomPicks.RandomFrom(random, subdirectories); + } + else + { + subdirectory = RandomSimpleString(random, 5, 20); + subdirectories.Add(subdirectory); + } + GenerateFile(random, Path.Combine(directory, subdirectory), stringsToQuery); + } + } + } + + private static void GenerateFile(Random random, string directory, ICollection stringsToQuery) + { + if (!System.IO.Directory.Exists(directory)) + System.IO.Directory.CreateDirectory(directory); + + string fileName = RandomSimpleString(random, 5, 25) + ".txt"; + int paragraphs = random.Next(5, 25); + + using (var writer = new StreamWriter(Path.Combine(directory, fileName), append: false, encoding: Encoding.UTF8)) + { + for (int i = 0; i < paragraphs; i++) + { + WriteParagraph(random, writer, stringsToQuery); + } + } + } + + private static void WriteParagraph(Random random, TextWriter writer, ICollection stringsToQuery) + { + int words = random.Next(50, 100); + bool addStringsToQuery = stringsToQuery != null && stringsToQuery.Count > 0; + + for (int i = 0; i < words; i++) + { + if (addStringsToQuery && random.Next(1, 1500) == 668) + writer.Write(RandomPicks.RandomFrom(random, stringsToQuery)); + else + writer.Write(RandomSimpleString(random, 1, 8)); + + if (i + 1 < words) + writer.Write(" "); + } + writer.WriteLine("."); + writer.WriteLine(); + } + + /// + /// Returns a random string consisting only of lowercase characters 'a' through 'z'. + /// + public static string RandomSimpleString(Random r, int minLength, int maxLength) + { + int end = RandomInts.RandomInt32Between(r, minLength, maxLength); + if (end == 0) + { + // allow 0 length + return ""; + } + char[] buffer = new char[end]; + for (int i = 0; i < end; i++) + { + buffer[i] = (char)RandomInts.RandomInt32Between(r, 'a', 'z'); + } + return new string(buffer, 0, end); + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Util/PathUtil.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/Util/PathUtil.cs new file mode 100644 index 0000000000..aaf9c8633b --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Util/PathUtil.cs @@ -0,0 +1,64 @@ +using System; +using System.IO; + +namespace Lucene.Net.Tests.BenchmarkDotNet.Util +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + public static class PathUtil + { + private const int TEMP_NAME_RETRY_THRESHOLD = 9999; + + public static DirectoryInfo CreateTempDir(string prefix) + { + //DirectoryInfo @base = BaseTempDirForTestClass(); + + int attempt = 0; + DirectoryInfo f; + bool iterate = true; + do + { + if (attempt++ >= TEMP_NAME_RETRY_THRESHOLD) + { + throw new Exception("Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: " + System.IO.Path.GetTempPath()); + } + // LUCENENET specific - need to use a random file name instead of a sequential one or two threads may attempt to do + // two operations on a file at the same time. + //f = new DirectoryInfo(Path.Combine(System.IO.Path.GetTempPath(), "LuceneTemp", prefix + "-" + attempt)); + f = new DirectoryInfo(Path.Combine(System.IO.Path.GetTempPath(), "LuceneTemp", prefix + "-" + Path.GetFileNameWithoutExtension(Path.GetRandomFileName()))); + + try + { + if (!System.IO.Directory.Exists(f.FullName)) + { + f.Create(); + iterate = false; + } + } +#pragma warning disable 168 + catch (IOException exc) +#pragma warning restore 168 + { + iterate = true; + } + } while (iterate); + + return f; + } + } +} From 90a92fc5a479c589190c751bf7f428f4e3bdfa97 Mon Sep 17 00:00:00 2001 From: Shad Storhaug Date: Sat, 25 Jul 2020 10:52:16 +0700 Subject: [PATCH 4/9] Lucene.Net.Tests.BenchmarkDotNet: Added jobs for 4.8.0-beta00011 --- src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs | 1 + 3 files changed, 3 insertions(+) diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs index 6abebbd970..4fffd66bb0 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs @@ -39,6 +39,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithId("4.8.0-beta00008")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs index 3a9119e4f6..4473d906d4 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs @@ -42,6 +42,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithId("4.8.0-beta00008")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs index 3c2c45a338..d59f374dbc 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs @@ -42,6 +42,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00009").WithId("4.8.0-beta00009")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00008").WithId("4.8.0-beta00008")); From 30ebad27e25a2c0fa1a7b79f0a810616fb18dbb0 Mon Sep 17 00:00:00 2001 From: Shad Storhaug Date: Sun, 16 Aug 2020 07:11:06 +0700 Subject: [PATCH 5/9] Added benchmarks for facet operations using Lucene.Net.Demo.Facet classes as a basis --- .../FacetsAssociationsBenchmarks.cs | 53 +++++++++++++++ .../FacetsDistanceBenchmarks.cs | 59 +++++++++++++++++ .../FacetsExpressionAggregationBenchmarks.cs | 50 +++++++++++++++ .../FacetsMultiCategoryListsBenchmarks.cs | 50 +++++++++++++++ .../FacetsRangeBenchmarks.cs | 64 +++++++++++++++++++ .../FacetsSimpleBenchmarks.cs | 59 +++++++++++++++++ .../FacetsSimpleSortedSetBenchmarks.cs | 53 +++++++++++++++ .../Lucene.Net.Tests.BenchmarkDotNet.csproj | 11 ++++ 8 files changed, 399 insertions(+) create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs new file mode 100644 index 0000000000..ddad50abcf --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs @@ -0,0 +1,53 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsAssociationsBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly AssociationsFacetsExample example = new AssociationsFacetsExample(); + + [Benchmark] + public void RunSumAssociations() => example.RunSumAssociations(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs new file mode 100644 index 0000000000..7933c06586 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs @@ -0,0 +1,59 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsDistanceBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly DistanceFacetsExample example = new DistanceFacetsExample(); + + [GlobalSetup] + public void GlobalSetup() => example.Index(); + + [GlobalCleanup] + public void GlobalTearDown() => example.Dispose(); + + [Benchmark] + public void Search() => example.Search(); + + [Benchmark] + public void DrillDown() => example.DrillDown(DistanceFacetsExample.TWO_KM); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs new file mode 100644 index 0000000000..fc845b8e36 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs @@ -0,0 +1,50 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsExpressionAggregationBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly ExpressionAggregationFacetsExample example = new ExpressionAggregationFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs new file mode 100644 index 0000000000..165ca3c6f0 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs @@ -0,0 +1,50 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsMultiCategoryListsBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly MultiCategoryListsFacetsExample example = new MultiCategoryListsFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs new file mode 100644 index 0000000000..b79d3bd0e9 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs @@ -0,0 +1,64 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsRangeBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly RangeFacetsExample example = new RangeFacetsExample(); + + [GlobalCleanup] + public void GlobalTearDown() => example.Dispose(); + + [Benchmark] + public void Search() + { + example.Index(); + example.Search(); + } + + [Benchmark] + public void DrillDown() + { + example.Index(); + example.DrillDown(example.PAST_SIX_HOURS); + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs new file mode 100644 index 0000000000..81c5e1a1ae --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs @@ -0,0 +1,59 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsSimpleBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly SimpleFacetsExample example = new SimpleFacetsExample(); + + [Benchmark] + public void RunFacetOnly() => example.RunFacetOnly(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + + [Benchmark] + public void RunDrillSideways() => example.RunDrillSideways(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs new file mode 100644 index 0000000000..fde4e662df --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs @@ -0,0 +1,53 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsSimpleSortedSetBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00008").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00008").WithId("4.8.0-beta00008")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00007").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00007").WithId("4.8.0-beta00007")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00006").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00006").WithId("4.8.0-beta00006")); + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00005").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00005").WithId("4.8.0-beta00005")); + } + } + + public static readonly SimpleSortedSetFacetsExample example = new SimpleSortedSetFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj index 781c6613ec..eafd350450 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/Lucene.Net.Tests.BenchmarkDotNet.csproj @@ -3,6 +3,7 @@ Exe netcoreapp3.1 + Lucene.Net.Tests.BenchmarkDotNet.Program @@ -11,7 +12,10 @@ + + + @@ -19,6 +23,13 @@ + + + + + + + From 491a2750eff4c3901d84a8b8d92797b64f8590ae Mon Sep 17 00:00:00 2001 From: Shad Storhaug Date: Sat, 19 Sep 2020 13:32:40 +0700 Subject: [PATCH 6/9] Lucene.Net.Tests.BenchmarkDotNet: Added benchmarks for 4.8.0-beta00012 --- .../FacetsAssociationsBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs | 1 + .../FacetsExpressionAggregationBenchmarks.cs | 1 + .../FacetsMultiCategoryListsBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs | 1 + .../FacetsSimpleSortedSetBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs | 1 + src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs | 1 + 10 files changed, 10 insertions(+) diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs index ddad50abcf..ac1ba8163a 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsAssociationsBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs index 7933c06586..cab51738ae 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsDistanceBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs index fc845b8e36..3ba2941deb 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsExpressionAggregationBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Expressions", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs index 165ca3c6f0..67ee1c5c67 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsMultiCategoryListsBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs index b79d3bd0e9..2dd6e0b98c 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsRangeBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs index 81c5e1a1ae..b9e9489afb 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs index fde4e662df..7ee6da8c16 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/FacetsSimpleSortedSetBenchmarks.cs @@ -32,6 +32,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.Facet", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs index 4fffd66bb0..7f47204494 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/HomePageScriptBenchmarks.cs @@ -39,6 +39,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs index 4473d906d4..97e9eb139b 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/IndexFilesBenchmarks.cs @@ -42,6 +42,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithId("4.8.0-beta00009")); diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs index d59f374dbc..d691a16b94 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet/SearchFilesBenchmarks.cs @@ -42,6 +42,7 @@ public Config() { var baseJob = Job.MediumRun; + AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00012").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00012").WithId("4.8.0-beta00012")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00011").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00011").WithId("4.8.0-beta00011")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00010").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00010").WithId("4.8.0-beta00010")); AddJob(baseJob.WithNuGet("Lucene.Net.Analysis.Common", "4.8.0-beta00009").WithNuGet("Lucene.Net.QueryParser", "4.8.0-beta00009").WithId("4.8.0-beta00009")); From c49322118c826d2bc03322be3f82497f744d1444 Mon Sep 17 00:00:00 2001 From: rafael-aero Date: Wed, 23 Sep 2020 14:09:47 +0200 Subject: [PATCH 7/9] Add separate benchmark.net project to run against code and not nuget packages --- Lucene.Net.sln | 25 +- .../FacetsAssociationsBenchmarks.cs | 45 ++++ .../FacetsDistanceBenchmarks.cs | 51 ++++ .../FacetsExpressionAggregationBenchmarks.cs | 42 ++++ .../FacetsMultiCategoryListsBenchmarks.cs | 42 ++++ .../FacetsRangeBenchmarks.cs | 56 +++++ .../FacetsSimpleBenchmarks.cs | 51 ++++ .../FacetsSimpleSortedSetBenchmarks.cs | 45 ++++ .../HomePageScriptBenchmarks.cs | 108 +++++++++ .../IndexFilesBenchmarks.cs | 224 ++++++++++++++++++ ...ene.Net.Tests.BenchmarkDotNet.Local.csproj | 34 +++ .../Program.cs | 47 ++++ .../SearchFilesBenchmarks.cs | 121 ++++++++++ .../Util/ContentGenerator.cs | 110 +++++++++ .../Util/PathUtil.cs | 64 +++++ 15 files changed, 1048 insertions(+), 17 deletions(-) create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsAssociationsBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsDistanceBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsExpressionAggregationBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsMultiCategoryListsBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsRangeBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleSortedSetBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/HomePageScriptBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/IndexFilesBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/Lucene.Net.Tests.BenchmarkDotNet.Local.csproj create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/SearchFilesBenchmarks.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/ContentGenerator.cs create mode 100644 src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/PathUtil.cs diff --git a/Lucene.Net.sln b/Lucene.Net.sln index 0e96e1adad..9fdc77b499 100644 --- a/Lucene.Net.sln +++ b/Lucene.Net.sln @@ -1,21 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. VisualStudioVersion = 16.0.29806.167 MinimumVisualStudioVersion = 15.0.26730.8 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "azure-templates", "azure-templates", "{05CE3A39-40D4-452D-AFE0-E57E536A08C6}" @@ -210,7 +194,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{4D0ED7D9 src\dotnet\Lucene.Net.CodeAnalysis\tools\install.ps1 = src\dotnet\Lucene.Net.CodeAnalysis\tools\install.ps1 src\dotnet\Lucene.Net.CodeAnalysis\tools\uninstall.ps1 = src\dotnet\Lucene.Net.CodeAnalysis\tools\uninstall.ps1 EndProjectSection -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lucene.Net.Tests.BenchmarkDotNet", "src\Lucene.Net.Tests.BenchmarkDotNet\Lucene.Net.Tests.BenchmarkDotNet.csproj", "{0C476146-411E-4C94-8A59-726A5F982A89}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lucene.Net.Tests.BenchmarkDotNet", "src\Lucene.Net.Tests.BenchmarkDotNet\Lucene.Net.Tests.BenchmarkDotNet.csproj", "{0C476146-411E-4C94-8A59-726A5F982A89}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lucene.Net.Tests.BenchmarkDotNet.Local", "src\Lucene.Net.Tests.BenchmarkDotNet.Local\Lucene.Net.Tests.BenchmarkDotNet.Local.csproj", "{3101FD09-F953-4313-A9BC-F0CC121E5E1A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -482,6 +469,10 @@ Global {0C476146-411E-4C94-8A59-726A5F982A89}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C476146-411E-4C94-8A59-726A5F982A89}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C476146-411E-4C94-8A59-726A5F982A89}.Release|Any CPU.Build.0 = Release|Any CPU + {3101FD09-F953-4313-A9BC-F0CC121E5E1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3101FD09-F953-4313-A9BC-F0CC121E5E1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3101FD09-F953-4313-A9BC-F0CC121E5E1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3101FD09-F953-4313-A9BC-F0CC121E5E1A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsAssociationsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsAssociationsBenchmarks.cs new file mode 100644 index 0000000000..ec9665e395 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsAssociationsBenchmarks.cs @@ -0,0 +1,45 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsAssociationsBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly AssociationsFacetsExample example = new AssociationsFacetsExample(); + + [Benchmark] + public void RunSumAssociations() => example.RunSumAssociations(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsDistanceBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsDistanceBenchmarks.cs new file mode 100644 index 0000000000..7203be1995 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsDistanceBenchmarks.cs @@ -0,0 +1,51 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsDistanceBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly DistanceFacetsExample example = new DistanceFacetsExample(); + + [GlobalSetup] + public void GlobalSetup() => example.Index(); + + [GlobalCleanup] + public void GlobalTearDown() => example.Dispose(); + + [Benchmark] + public void Search() => example.Search(); + + [Benchmark] + public void DrillDown() => example.DrillDown(DistanceFacetsExample.TWO_KM); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsExpressionAggregationBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsExpressionAggregationBenchmarks.cs new file mode 100644 index 0000000000..ac22930863 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsExpressionAggregationBenchmarks.cs @@ -0,0 +1,42 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsExpressionAggregationBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly ExpressionAggregationFacetsExample example = new ExpressionAggregationFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsMultiCategoryListsBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsMultiCategoryListsBenchmarks.cs new file mode 100644 index 0000000000..12511d450b --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsMultiCategoryListsBenchmarks.cs @@ -0,0 +1,42 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsMultiCategoryListsBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly MultiCategoryListsFacetsExample example = new MultiCategoryListsFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsRangeBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsRangeBenchmarks.cs new file mode 100644 index 0000000000..117b229ba8 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsRangeBenchmarks.cs @@ -0,0 +1,56 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsRangeBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly RangeFacetsExample example = new RangeFacetsExample(); + + [GlobalCleanup] + public void GlobalTearDown() => example.Dispose(); + + [Benchmark] + public void Search() + { + example.Index(); + example.Search(); + } + + [Benchmark] + public void DrillDown() + { + example.Index(); + example.DrillDown(example.PAST_SIX_HOURS); + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleBenchmarks.cs new file mode 100644 index 0000000000..b7601a0dbe --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleBenchmarks.cs @@ -0,0 +1,51 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsSimpleBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly SimpleFacetsExample example = new SimpleFacetsExample(); + + [Benchmark] + public void RunFacetOnly() => example.RunFacetOnly(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + + [Benchmark] + public void RunDrillSideways() => example.RunDrillSideways(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleSortedSetBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleSortedSetBenchmarks.cs new file mode 100644 index 0000000000..5118413622 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/FacetsSimpleSortedSetBenchmarks.cs @@ -0,0 +1,45 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Demo.Facet; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class FacetsSimpleSortedSetBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + public static readonly SimpleSortedSetFacetsExample example = new SimpleSortedSetFacetsExample(); + + [Benchmark] + public void RunSearch() => example.RunSearch(); + + [Benchmark] + public void RunDrillDown() => example.RunDrillDown(); + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/HomePageScriptBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/HomePageScriptBenchmarks.cs new file mode 100644 index 0000000000..e0b298a556 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/HomePageScriptBenchmarks.cs @@ -0,0 +1,108 @@ +using System; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Util; +using Lucene.Net.Store; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Index; +using Lucene.Net.Documents; +using Lucene.Net.Search; +using System.Diagnostics; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class HomePageScriptBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + private const int _directoryWriterIterations = 10; + private const int _indexSearchIterations = 25; + + [Benchmark] + public void HomePageScript() + { + // Ensures index backwards compatibility + var AppLuceneVersion = LuceneVersion.LUCENE_48; + + for (int d = 0; d < _directoryWriterIterations; d++) + { + using var dir = new RAMDirectory(); + + //create an analyzer to process the text + var analyzer = new StandardAnalyzer(AppLuceneVersion); + + //create an index writer + var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer); + using var writer = new IndexWriter(dir, indexConfig); + + for (int i = 0; i < _indexSearchIterations; i++) + { + var source = new + { + Name = $"Kermit{i} the Frog{i}", + FavoritePhrase = $"The quick{i} brown{i} fox{i} jumps{i} over{i} the lazy{i} dog{i} " + }; + Document doc = new Document + { + // StringField indexes but doesn't tokenize + new StringField("name", source.Name, Field.Store.YES), + new TextField("favoritePhrase", source.FavoritePhrase, Field.Store.YES) + }; + + writer.AddDocument(doc); + writer.Flush(triggerMerge: false, applyAllDeletes: false); + } + + for (int i = 0; i < _indexSearchIterations; i++) + { + // search with a phrase + var phrase = new MultiPhraseQuery + { + new Term("favoritePhrase", $"brown{i}"), + new Term("favoritePhrase", $"fox{i}") + }; + + // re-use the writer to get real-time updates + using var reader = writer.GetReader(applyAllDeletes: true); + var searcher = new IndexSearcher(reader); + var hits = searcher.Search(phrase, 20 /* top 20 */).ScoreDocs; + Debug.Assert(hits.Length > 0); + foreach (var hit in hits) + { + var foundDoc = searcher.Doc(hit.Doc); + var score = hit.Score; + var name = foundDoc.Get("name"); + var favoritePhrase = foundDoc.Get("favoritePhrase"); + } + } + } + } + + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/IndexFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/IndexFilesBenchmarks.cs new file mode 100644 index 0000000000..f82fa1e72f --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/IndexFilesBenchmarks.cs @@ -0,0 +1,224 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Documents; +using Lucene.Net.Index; +using Lucene.Net.Randomized.Generators; +using Lucene.Net.Store; +using Lucene.Net.Tests.BenchmarkDotNet.Util; +using Lucene.Net.Util; +using System; +using System.IO; +using System.Text; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class IndexFilesBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + private static DirectoryInfo sourceDirectory; + private static DirectoryInfo indexDirectory; + + [GlobalSetup] + public void GlobalSetUp() + { + sourceDirectory = PathUtil.CreateTempDir("sourceFiles"); + int seed = 2342; + ContentGenerator.GenerateFiles(new Random(seed), sourceDirectory.FullName, 250); + } + + [GlobalCleanup] + public void GlobalTearDown() + { + try + { + if (System.IO.Directory.Exists(sourceDirectory.FullName)) + System.IO.Directory.Delete(sourceDirectory.FullName, recursive: true); + } + catch { } + } + + [IterationSetup] + public void IterationSetUp() + { + indexDirectory = PathUtil.CreateTempDir("indexFiles"); + } + + [IterationCleanup] + public void IterationTearDown() + { + try + { + if (System.IO.Directory.Exists(indexDirectory.FullName)) + System.IO.Directory.Delete(indexDirectory.FullName, recursive: true); + } + catch { } + + } + + /// Index all text files under a directory. + [Benchmark] + public void IndexFiles() => IndexFiles(sourceDirectory, indexDirectory); + + /// Index all text files under a directory. + public static void IndexFiles(DirectoryInfo sourceDirectory, DirectoryInfo indexDirectory) + { + string indexPath = indexDirectory.FullName; + + bool create = true; + + Store.Directory dir = FSDirectory.Open(indexPath); + // :Post-Release-Update-Version.LUCENE_XY: + Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); + IndexWriterConfig iwc = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer); + + if (create) + { + // Create a new index in the directory, removing any + // previously indexed documents: + iwc.OpenMode = OpenMode.CREATE; + } + else + { + // Add new documents to an existing index: + iwc.OpenMode = OpenMode.CREATE_OR_APPEND; + } + + // Optional: for better indexing performance, if you + // are indexing many documents, increase the RAM + // buffer. + // + // iwc.RAMBufferSizeMB = 256.0; + + using (IndexWriter writer = new IndexWriter(dir, iwc)) + { + IndexDocs(writer, sourceDirectory); + + // NOTE: if you want to maximize search performance, + // you can optionally call forceMerge here. This can be + // a terribly costly operation, so generally it's only + // worth it when your index is relatively static (ie + // you're done adding documents to it): + // + // writer.ForceMerge(1); + } + } + + /// + /// Recurses over files and directories found under the + /// given directory and indexes each file. + /// + /// NOTE: This method indexes one document per input file. + /// This is slow. For good throughput, put multiple documents + /// into your input file(s). + /// + /// + /// to the index where the given + /// file/dir info will be stored + /// + /// + /// The directory to recurse into to find files to index. + /// + /// + /// If there is a low-level I/O error. + /// + internal static void IndexDocs(IndexWriter writer, DirectoryInfo directoryInfo) + { + foreach (var dirInfo in directoryInfo.GetDirectories()) + { + IndexDocs(writer, dirInfo); + } + foreach (var fileInfo in directoryInfo.GetFiles()) + { + IndexDocs(writer, fileInfo); + } + } + + /// + /// Indexes the given file using the given writer. + /// + /// + /// to the index where the given + /// file info will be stored. + /// + /// + /// The file to index. + /// + /// + /// If there is a low-level I/O error. + /// + internal static void IndexDocs(IndexWriter writer, FileInfo file) + { + using (FileStream fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) + { + // make a new, empty document + Document doc = new Document(); + + // Add the path of the file as a field named "path". Use a + // field that is indexed (i.e. searchable), but don't tokenize + // the field into separate words and don't index term frequency + // or positional information: + Field pathField = new StringField("path", file.FullName, Field.Store.YES); + doc.Add(pathField); + + // Add the last modified date of the file a field named "modified". + // Use a LongField that is indexed (i.e. efficiently filterable with + // NumericRangeFilter). This indexes to milli-second resolution, which + // is often too fine. You could instead create a number based on + // year/month/day/hour/minutes/seconds, down the resolution you require. + // For example the long value 2011021714 would mean + // February 17, 2011, 2-3 PM. + doc.Add(new Int64Field("modified", file.LastWriteTimeUtc.Ticks, Field.Store.NO)); + + // Add the contents of the file to a field named "contents". Specify a Reader, + // so that the text of the file is tokenized and indexed, but not stored. + // Note that FileReader expects the file to be in UTF-8 encoding. + // If that's not the case searching for special characters will fail. + doc.Add(new TextField("contents", new StreamReader(fs, Encoding.UTF8))); + + if (writer.Config.OpenMode == OpenMode.CREATE) + { + // New index, so we just add the document (no old document can be there): + //Console.WriteLine("adding " + file); + writer.AddDocument(doc); + } + else + { + // Existing index (an old copy of this document may have been indexed) so + // we use updateDocument instead to replace the old one matching the exact + // path, if present: + //Console.WriteLine("updating " + file); + writer.UpdateDocument(new Term("path", file.FullName), doc); + } + } + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Lucene.Net.Tests.BenchmarkDotNet.Local.csproj b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Lucene.Net.Tests.BenchmarkDotNet.Local.csproj new file mode 100644 index 0000000000..aafc80f5f4 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Lucene.Net.Tests.BenchmarkDotNet.Local.csproj @@ -0,0 +1,34 @@ + + + + Exe + netcoreapp3.1 + Lucene.Net.Tests.BenchmarkDotNet.Program + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs new file mode 100644 index 0000000000..f635f39686 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs @@ -0,0 +1,47 @@ +using BenchmarkDotNet.Running; +using System; +using System.Threading.Tasks; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + class Program + { + private static void Main(string[] args) + { + Console.WriteLine("Setup"); + var sf = new SearchFilesBenchmarks(); + sf.GlobalSetUp(); + + Console.WriteLine("Running"); + + Parallel.For(0, 10_000, (i) => sf.SearchFiles()); + + Console.WriteLine("Teardown"); + + sf.GlobalTearDown(); + + Console.WriteLine("Done"); + + + + //new BenchmarkSwitcher(typeof(Program).Assembly).Run(args); + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/SearchFilesBenchmarks.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/SearchFilesBenchmarks.cs new file mode 100644 index 0000000000..a8caa54b1e --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/SearchFilesBenchmarks.cs @@ -0,0 +1,121 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Index; +using Lucene.Net.QueryParsers.Classic; +using Lucene.Net.Randomized.Generators; +using Lucene.Net.Search; +using Lucene.Net.Store; +using Lucene.Net.Tests.BenchmarkDotNet.Util; +using Lucene.Net.Util; +using System; +using System.IO; + +namespace Lucene.Net.Tests.BenchmarkDotNet +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + [MemoryDiagnoser] + [Config(typeof(Config))] + public class SearchFilesBenchmarks + { + private class Config : ManualConfig + { + public Config() + { + AddJob(Job.MediumRun); + } + } + + private const string QueryString = "settings"; + private static DirectoryInfo indexDirectory; + + [GlobalSetup] + public void GlobalSetUp() + { + var sourceDirectory = PathUtil.CreateTempDir("sourceFiles"); + + // Generate content to index (including our string that we will search for) + int seed = 2342; + ContentGenerator.GenerateFiles(new Random(seed), sourceDirectory.FullName, 100, QueryString); + + + // Index the content + indexDirectory = PathUtil.CreateTempDir("indexFiles"); + IndexFilesBenchmarks.IndexFiles(sourceDirectory, indexDirectory); + + // Cleanup our source files, they are no longer needed + try + { + if (System.IO.Directory.Exists(sourceDirectory.FullName)) + System.IO.Directory.Delete(sourceDirectory.FullName, recursive: true); + } + catch { } + } + + [GlobalCleanup] + public void GlobalTearDown() + { + try + { + if (System.IO.Directory.Exists(indexDirectory.FullName)) + System.IO.Directory.Delete(indexDirectory.FullName, recursive: true); + } + catch { } + } + + [Benchmark] + public void SearchFiles() + { + + string index = indexDirectory.FullName; + string field = "contents"; + //string queries = null; + int repeat = 1000; + //bool raw = false; + string queryString = QueryString; + //int hitsPerPage = 10; + + using (IndexReader reader = DirectoryReader.Open(FSDirectory.Open(index))) + { + IndexSearcher searcher = new IndexSearcher(reader); + // :Post-Release-Update-Version.LUCENE_XY: + Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); + + // :Post-Release-Update-Version.LUCENE_XY: + QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, field, analyzer); + + Query query = parser.Parse(queryString.Trim()); + //Console.WriteLine("Searching for: " + query.ToString(field)); + + // repeat & time as benchmark + { + //DateTime start = DateTime.UtcNow; + for (int i = 0; i < repeat; i++) + { + searcher.Search(query, null, 100); + } + //DateTime end = DateTime.UtcNow; + //Console.WriteLine("Time: " + (end - start).TotalMilliseconds + "ms"); + } + } // Disposes reader + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/ContentGenerator.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/ContentGenerator.cs new file mode 100644 index 0000000000..15612e9229 --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/ContentGenerator.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Lucene.Net.Randomized.Generators +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + public static class ContentGenerator + { + public static void GenerateFiles(Random random, string directory, int numberOfFiles, params string[] stringsToQuery) + { + var subdirectories = new HashSet(); + for (int i = 0; i < numberOfFiles; i++) + { + bool root = random.Next(1, 100) > 50; + + if (root) + { + GenerateFile(random, directory, stringsToQuery); + } + else + { + string subdirectory; + if (subdirectories.Count > 0 && random.Next(1, 100) > 30) + { + subdirectory = RandomPicks.RandomFrom(random, subdirectories); + } + else + { + subdirectory = RandomSimpleString(random, 5, 20); + subdirectories.Add(subdirectory); + } + GenerateFile(random, Path.Combine(directory, subdirectory), stringsToQuery); + } + } + } + + private static void GenerateFile(Random random, string directory, ICollection stringsToQuery) + { + if (!System.IO.Directory.Exists(directory)) + System.IO.Directory.CreateDirectory(directory); + + string fileName = RandomSimpleString(random, 5, 25) + ".txt"; + int paragraphs = random.Next(5, 25); + + using (var writer = new StreamWriter(Path.Combine(directory, fileName), append: false, encoding: Encoding.UTF8)) + { + for (int i = 0; i < paragraphs; i++) + { + WriteParagraph(random, writer, stringsToQuery); + } + } + } + + private static void WriteParagraph(Random random, TextWriter writer, ICollection stringsToQuery) + { + int words = random.Next(50, 100); + bool addStringsToQuery = stringsToQuery != null && stringsToQuery.Count > 0; + + for (int i = 0; i < words; i++) + { + if (addStringsToQuery && random.Next(1, 1500) == 668) + writer.Write(RandomPicks.RandomFrom(random, stringsToQuery)); + else + writer.Write(RandomSimpleString(random, 1, 8)); + + if (i + 1 < words) + writer.Write(" "); + } + writer.WriteLine("."); + writer.WriteLine(); + } + + /// + /// Returns a random string consisting only of lowercase characters 'a' through 'z'. + /// + public static string RandomSimpleString(Random r, int minLength, int maxLength) + { + int end = RandomInts.RandomInt32Between(r, minLength, maxLength); + if (end == 0) + { + // allow 0 length + return ""; + } + char[] buffer = new char[end]; + for (int i = 0; i < end; i++) + { + buffer[i] = (char)RandomInts.RandomInt32Between(r, 'a', 'z'); + } + return new string(buffer, 0, end); + } + } +} diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/PathUtil.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/PathUtil.cs new file mode 100644 index 0000000000..aaf9c8633b --- /dev/null +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Util/PathUtil.cs @@ -0,0 +1,64 @@ +using System; +using System.IO; + +namespace Lucene.Net.Tests.BenchmarkDotNet.Util +{ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + public static class PathUtil + { + private const int TEMP_NAME_RETRY_THRESHOLD = 9999; + + public static DirectoryInfo CreateTempDir(string prefix) + { + //DirectoryInfo @base = BaseTempDirForTestClass(); + + int attempt = 0; + DirectoryInfo f; + bool iterate = true; + do + { + if (attempt++ >= TEMP_NAME_RETRY_THRESHOLD) + { + throw new Exception("Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: " + System.IO.Path.GetTempPath()); + } + // LUCENENET specific - need to use a random file name instead of a sequential one or two threads may attempt to do + // two operations on a file at the same time. + //f = new DirectoryInfo(Path.Combine(System.IO.Path.GetTempPath(), "LuceneTemp", prefix + "-" + attempt)); + f = new DirectoryInfo(Path.Combine(System.IO.Path.GetTempPath(), "LuceneTemp", prefix + "-" + Path.GetFileNameWithoutExtension(Path.GetRandomFileName()))); + + try + { + if (!System.IO.Directory.Exists(f.FullName)) + { + f.Create(); + iterate = false; + } + } +#pragma warning disable 168 + catch (IOException exc) +#pragma warning restore 168 + { + iterate = true; + } + } while (iterate); + + return f; + } + } +} From a672a22389b8d4dd51ed59393e0ad55a92f3e6e9 Mon Sep 17 00:00:00 2001 From: rafael-aero Date: Wed, 23 Sep 2020 14:10:55 +0200 Subject: [PATCH 8/9] Remove debug code --- .../Program.cs | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs index f635f39686..e37e658379 100644 --- a/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs +++ b/src/Lucene.Net.Tests.BenchmarkDotNet.Local/Program.cs @@ -25,23 +25,7 @@ class Program { private static void Main(string[] args) { - Console.WriteLine("Setup"); - var sf = new SearchFilesBenchmarks(); - sf.GlobalSetUp(); - - Console.WriteLine("Running"); - - Parallel.For(0, 10_000, (i) => sf.SearchFiles()); - - Console.WriteLine("Teardown"); - - sf.GlobalTearDown(); - - Console.WriteLine("Done"); - - - - //new BenchmarkSwitcher(typeof(Program).Assembly).Run(args); + new BenchmarkSwitcher(typeof(Program).Assembly).Run(args); } } } From 25dc87ebbb0342bb400621f3763123b521f754a1 Mon Sep 17 00:00:00 2001 From: rafael-aero Date: Wed, 23 Sep 2020 14:11:59 +0200 Subject: [PATCH 9/9] VS removed the license info by mistake --- Lucene.Net.sln | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Lucene.Net.sln b/Lucene.Net.sln index 9fdc77b499..9ed38ea252 100644 --- a/Lucene.Net.sln +++ b/Lucene.Net.sln @@ -1,5 +1,21 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. VisualStudioVersion = 16.0.29806.167 MinimumVisualStudioVersion = 15.0.26730.8 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "azure-templates", "azure-templates", "{05CE3A39-40D4-452D-AFE0-E57E536A08C6}"