AddBenchmark.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System.Reflection;
  2. using BenchmarkDotNet.Attributes;
  3. using Lua;
  4. using Lua.Standard;
  5. using MoonSharp.Interpreter;
  6. sealed class AddFunction : Lua.LuaFunction
  7. {
  8. protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
  9. {
  10. buffer.Span[0] = context.GetArgument<double>(0) + context.GetArgument<double>(1);
  11. return new(1);
  12. }
  13. }
  14. [Config(typeof(BenchmarkConfig))]
  15. public class AddBenchmark
  16. {
  17. BenchmarkCore core = new();
  18. LuaValue[] buffer = new LuaValue[1];
  19. public static double Add(double x, double y)
  20. {
  21. return x + y;
  22. }
  23. [IterationSetup]
  24. public void Setup()
  25. {
  26. core = new();
  27. core.Setup("add.lua");
  28. core.LuaCSharpState.OpenStandardLibraries();
  29. core.LuaCSharpState.Environment["add"] = new AddFunction();
  30. core.MoonSharpState.Globals["add"] = (Func<double, double, double>)Add;
  31. core.NLuaState.RegisterFunction("add", typeof(AddBenchmark).GetMethod(nameof(Add), BindingFlags.Static | BindingFlags.Public));
  32. core.NeoLuaEnvironment.SetValue("add", (Func<double, double, double>)Add);
  33. }
  34. [IterationCleanup]
  35. public void Cleanup()
  36. {
  37. core.Dispose();
  38. core = default!;
  39. GC.Collect();
  40. }
  41. [Benchmark(Description = "MoonSharp (RunString)")]
  42. public DynValue Benchmark_MoonSharp_String()
  43. {
  44. return core.MoonSharpState.DoString(core.SourceText);
  45. }
  46. [Benchmark(Description = "MoonSharp (RunFile)")]
  47. public DynValue Benchmark_MoonSharp_File()
  48. {
  49. return core.MoonSharpState.DoFile(core.FilePath);
  50. }
  51. [Benchmark(Description = "NLua (DoString)")]
  52. public object[] Benchmark_NLua_String()
  53. {
  54. return core.NLuaState.DoString(core.SourceText);
  55. }
  56. [Benchmark(Description = "NLua (DoFile)")]
  57. public object[] Benchmark_NLua_File()
  58. {
  59. return core.NLuaState.DoFile(core.FilePath);
  60. }
  61. [Benchmark(Description = "NeoLua (DoChunk(code))")]
  62. public Neo.IronLua.LuaResult Benchmark_NeoLua_String()
  63. {
  64. return core.NeoLuaEnvironment.DoChunk(core.SourceText, "chunk");
  65. }
  66. [Benchmark(Description = "NeoLua (DoChunk(fileName))")]
  67. public Neo.IronLua.LuaResult Benchmark_NeoLua_File()
  68. {
  69. return core.NeoLuaEnvironment.DoChunk(core.FilePath);
  70. }
  71. [Benchmark(Description = "Lua-CSharp (DoString)")]
  72. public async Task<LuaValue> Benchmark_LuaCSharp_String()
  73. {
  74. await core.LuaCSharpState.DoStringAsync(core.SourceText, buffer);
  75. return buffer[0];
  76. }
  77. [Benchmark(Description = "Lua-CSharp (DoFileAsync)")]
  78. public async Task<LuaValue> Benchmark_LuaCSharp_File()
  79. {
  80. await core.LuaCSharpState.DoFileAsync(core.FilePath, buffer);
  81. return buffer[0];
  82. }
  83. }