InterpreterSteps.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using BenchmarkDotNet.Attributes;
  2. using Lua;
  3. using Lua.CodeAnalysis.Compilation;
  4. using Lua.CodeAnalysis.Syntax;
  5. using Lua.Runtime;
  6. using Lua.Standard;
  7. [Config(typeof(BenchmarkConfig))]
  8. public class InterpreterSteps
  9. {
  10. string sourceText = default!;
  11. LuaState state = default!;
  12. SyntaxToken[] tokens = [];
  13. LuaSyntaxTree ast = default!;
  14. Chunk chunk = default!;
  15. LuaValue[] results = new LuaValue[1];
  16. [GlobalSetup]
  17. public void GlobalSetup()
  18. {
  19. var filePath = FileHelper.GetAbsolutePath("n-body.lua");
  20. sourceText = File.ReadAllText(filePath);
  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. [IterationSetup]
  40. public void Setup()
  41. {
  42. state = default!;
  43. GC.Collect();
  44. state = LuaState.Create();
  45. state.OpenStandardLibraries();
  46. }
  47. [Benchmark]
  48. public void CreateState()
  49. {
  50. LuaState.Create();
  51. }
  52. [Benchmark]
  53. public void Lexer()
  54. {
  55. var lexer = new Lexer
  56. {
  57. Source = sourceText.AsMemory()
  58. };
  59. while (lexer.MoveNext()) { }
  60. }
  61. [Benchmark]
  62. public LuaSyntaxTree Parser()
  63. {
  64. var parser = new Parser();
  65. foreach (var token in tokens)
  66. {
  67. parser.Add(token);
  68. }
  69. return parser.Parse();
  70. }
  71. [Benchmark]
  72. public Chunk Compile()
  73. {
  74. return LuaCompiler.Default.Compile(ast);
  75. }
  76. [Benchmark]
  77. public async ValueTask RunAsync()
  78. {
  79. await state.RunAsync(chunk, results);
  80. }
  81. }