InterpreterSteps.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using BenchmarkDotNet.Attributes;
  2. using Lua;
  3. using Lua.CodeAnalysis.Compilation;
  4. using Lua.CodeAnalysis.Syntax;
  5. using Lua.Runtime;
  6. [Config(typeof(BenchmarkConfig))]
  7. public class InterpreterSteps
  8. {
  9. string sourceText = default!;
  10. LuaState state = default!;
  11. SyntaxToken[] tokens = [];
  12. LuaSyntaxTree ast = default!;
  13. Chunk chunk = default!;
  14. LuaValue[] results = new LuaValue[1];
  15. [GlobalSetup]
  16. public void GlobalSetup()
  17. {
  18. var filePath = FileHelper.GetAbsolutePath("add.lua");
  19. sourceText = File.ReadAllText(filePath);
  20. state = LuaState.Create();
  21. var lexer = new Lexer
  22. {
  23. Source = sourceText.AsMemory()
  24. };
  25. var buffer = new List<SyntaxToken>();
  26. while (lexer.MoveNext())
  27. {
  28. buffer.Add(lexer.Current);
  29. }
  30. tokens = buffer.ToArray();
  31. var parser = new Parser();
  32. foreach (var token in tokens)
  33. {
  34. parser.Add(token);
  35. }
  36. ast = parser.Parse();
  37. chunk = LuaCompiler.Default.Compile(ast);
  38. }
  39. [Benchmark]
  40. public void CreateState()
  41. {
  42. LuaState.Create();
  43. }
  44. [Benchmark]
  45. public void Lexer()
  46. {
  47. var lexer = new Lexer
  48. {
  49. Source = sourceText.AsMemory()
  50. };
  51. while (lexer.MoveNext()) { }
  52. }
  53. [Benchmark]
  54. public LuaSyntaxTree Parser()
  55. {
  56. var parser = new Parser();
  57. foreach (var token in tokens)
  58. {
  59. parser.Add(token);
  60. }
  61. return parser.Parse();
  62. }
  63. [Benchmark]
  64. public Chunk Compile()
  65. {
  66. return LuaCompiler.Default.Compile(ast);
  67. }
  68. [Benchmark]
  69. public async ValueTask RunAsync()
  70. {
  71. await state.RunAsync(chunk, results);
  72. }
  73. }