CanonSharp/CanonSharp.Benchmark/Benchmarks/GrammarParserBenchmark.cs

74 lines
2.0 KiB
C#
Raw Normal View History

using BenchmarkDotNet.Attributes;
using CanonSharp.Benchmark.Canon.Core;
using CanonSharp.Benchmark.Canon.Core.Abstractions;
using CanonSharp.Benchmark.Canon.Core.GrammarParser;
using CanonSharp.Benchmark.Canon.Core.LexicalParser;
using CanonSharp.Benchmark.Canon.Core.SyntaxNodes;
using CanonSharp.Pascal.Parser;
using CanonSharp.Pascal.Scanner;
namespace CanonSharp.Benchmark.Benchmarks;
public class GrammarParserBenchmark
{
private readonly List<string> _inputFiles = [];
// CanonSharp
private readonly LexicalScanner _scanner = new();
private readonly GrammarParser _parser = new();
// Canon
private readonly IGrammarParser _grammarParser = GeneratedGrammarParser.Instance;
public GrammarParserBenchmark()
{
_inputFiles.AddRange(ReadOpenSet());
}
[Benchmark]
[ArgumentsSource(nameof(InputFiles))]
public Pascal.SyntaxTree.Program CanonSharpParse(int index)
{
IEnumerable<LexicalToken> tokens = _scanner.Tokenize(new StringReadState(_inputFiles[index]));
return _parser.Parse(tokens);
}
[Benchmark]
[ArgumentsSource(nameof(InputFiles))]
public ProgramStruct CanonParse(int index)
{
Lexer lexer = new();
IEnumerable<SemanticToken> tokens = lexer.Tokenize(new StringSourceReader(_inputFiles[index]));
return _grammarParser.Analyse(tokens);
}
public IEnumerable<object> InputFiles()
{
for (int i = 0; i < _inputFiles.Count; i++)
{
yield return i;
}
}
private static List<string> ReadOpenSet()
{
DirectoryInfo baseDirectory = new("/home/ricardo/Documents/Code/CSharp/CanonSharp/OpenSet");
if (!baseDirectory.Exists)
{
throw new InvalidOperationException("Can't find 'OpenSet' directory.");
}
List<string> result = [];
foreach (FileInfo file in baseDirectory.EnumerateFiles())
{
using StreamReader reader = file.OpenText();
result.Add(reader.ReadToEnd());
}
return result;
}
}