EngineComparisonBenchmark.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using BenchmarkDotNet.Attributes;
  2. using BenchmarkDotNet.Configs;
  3. using BenchmarkDotNet.Order;
  4. namespace Jint.Benchmark;
  5. [RankColumn]
  6. [MemoryDiagnoser]
  7. [Orderer(SummaryOrderPolicy.FastestToSlowest)]
  8. [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByParams)]
  9. [HideColumns("Error", "Gen0", "Gen1", "Gen2")]
  10. [BenchmarkCategory("EngineComparison")]
  11. public class EngineComparisonBenchmark
  12. {
  13. private static readonly Dictionary<string, Prepared<Script>> _parsedScripts = new();
  14. private static readonly Dictionary<string, string> _files = new()
  15. {
  16. { "array-stress", null },
  17. { "evaluation", null },
  18. { "evaluation-modern", null },
  19. { "linq-js", null },
  20. { "minimal", null },
  21. { "stopwatch", null },
  22. { "stopwatch-modern", null },
  23. { "dromaeo-3d-cube", null },
  24. { "dromaeo-3d-cube-modern", null },
  25. { "dromaeo-core-eval", null },
  26. { "dromaeo-core-eval-modern", null },
  27. { "dromaeo-object-array", null },
  28. { "dromaeo-object-array-modern", null },
  29. { "dromaeo-object-regexp", null },
  30. { "dromaeo-object-regexp-modern", null },
  31. { "dromaeo-object-string", null },
  32. { "dromaeo-object-string-modern", null },
  33. { "dromaeo-string-base64", null },
  34. { "dromaeo-string-base64-modern", null },
  35. };
  36. private static readonly string _dromaeoHelpers = @"
  37. var startTest = function () { };
  38. var test = function (name, fn) { fn(); };
  39. var endTest = function () { };
  40. var prep = function (fn) { fn(); };";
  41. [GlobalSetup]
  42. public void Setup()
  43. {
  44. foreach (var fileName in _files.Keys.ToList())
  45. {
  46. var script = File.ReadAllText($"Scripts/{fileName}.js");
  47. if (fileName.Contains("dromaeo"))
  48. {
  49. script = _dromaeoHelpers + Environment.NewLine + Environment.NewLine + script;
  50. }
  51. _files[fileName] = script;
  52. _parsedScripts[fileName] = Engine.PrepareScript(script, strict: true);
  53. }
  54. }
  55. [ParamsSource(nameof(FileNames))]
  56. public string FileName { get; set; }
  57. public IEnumerable<string> FileNames()
  58. {
  59. return _files.Select(entry => entry.Key);
  60. }
  61. [Benchmark]
  62. public void Jint()
  63. {
  64. var engine = new Engine(static options => options.Strict());
  65. engine.Execute(_files[FileName]);
  66. }
  67. [Benchmark]
  68. public void Jint_ParsedScript()
  69. {
  70. var engine = new Engine(static options => options.Strict());
  71. engine.Execute(_parsedScripts[FileName]);
  72. }
  73. [Benchmark]
  74. public void Jurassic()
  75. {
  76. var engine = new Jurassic.ScriptEngine { ForceStrictMode = true };
  77. engine.Execute(_files[FileName]);
  78. }
  79. [Benchmark]
  80. public void NilJS()
  81. {
  82. var engine = new NiL.JS.Core.Context(strict: true);
  83. engine.Eval(_files[FileName]);
  84. }
  85. [Benchmark]
  86. public void YantraJS()
  87. {
  88. var engine = new YantraJS.Core.JSContext();
  89. // By default YantraJS is strict mode only, in strict mode
  90. // we need to pass `this` explicitly in global context
  91. // if script is expecting global context as `this`
  92. engine.Eval(_files[FileName], null, engine);
  93. }
  94. }