浏览代码

convert Jint.Benchmark to use BenchmarkDotNet

Marko Lahma 7 年之前
父节点
当前提交
056fea2ecb
共有 4 个文件被更改,包括 75 次插入96 次删除
  1. 3 0
      .gitignore
  2. 64 0
      Jint.Benchmark/EvaluationBenchmark.cs
  3. 2 4
      Jint.Benchmark/Jint.Benchmark.csproj
  4. 6 92
      Jint.Benchmark/Program.cs

+ 3 - 0
.gitignore

@@ -158,3 +158,6 @@ Jint.sln.ide/*
 .vs
 project.lock.json
 .build
+
+.idea
+BenchmarkDotNet.Artifacts

+ 64 - 0
Jint.Benchmark/EvaluationBenchmark.cs

@@ -0,0 +1,64 @@
+using BenchmarkDotNet.Attributes;
+using Jurassic;
+
+namespace Jint.Benchmark
+{
+    [MemoryDiagnoser]
+    public class EvaluationBenchmark
+    {
+        private Engine sharedJint;
+        private ScriptEngine sharedJurassic;
+
+        private const string Script = @"
+            var o = {};
+            o.Foo = 'bar';
+            o.Baz = 42.0001;
+            o.Blah = o.Foo + o.Baz;
+
+            if(o.Blah != 'bar42.0001') throw TypeError;
+
+            function fib(n){
+                if(n<2) {
+                    return n;
+                }
+
+                return fib(n-1) + fib(n-2);
+            }
+
+            if(fib(3) != 2) throw TypeError;
+        ";
+
+        [GlobalSetup]
+        public void Setup()
+        {
+            sharedJint = new Engine();
+            sharedJurassic = new ScriptEngine();
+        }
+
+        [Params(10, 20)]
+        public int Iterations { get; set; }
+
+        [Params(true, false)]
+        public bool ReuseEngine { get; set; }
+
+        [Benchmark]
+        public void Jint()
+        {
+            for (var i = 0; i < Iterations; i++)
+            {
+                var jint = ReuseEngine ? sharedJint : new Engine();
+                jint.Execute(Script);
+            }
+        }
+
+        [Benchmark]
+        public void Jurassic()
+        {
+            for (var i = 0; i < Iterations; i++)
+            {
+                var jurassic = ReuseEngine ? sharedJurassic : new ScriptEngine();
+                jurassic.Execute(Script);
+            }
+        }
+    }
+}

+ 2 - 4
Jint.Benchmark/Jint.Benchmark.csproj

@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <AssemblyName>Jint.Benchmark</AssemblyName>
@@ -14,10 +13,9 @@
     <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
     <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
   </PropertyGroup>
-
   <ItemGroup>
     <ProjectReference Include="..\Jint\Jint.csproj" />
+    <PackageReference Include="BenchmarkDotNet" Version="0.10.11" />
     <PackageReference Include="Jurassic" Version="3.0.0-alpha2" />
   </ItemGroup>
-
-</Project>
+</Project>

+ 6 - 92
Jint.Benchmark/Program.cs

@@ -1,99 +1,13 @@
-using System;
-using System.Diagnostics;
+using System.Reflection;
+using BenchmarkDotNet.Running;
 
 namespace Jint.Benchmark
 {
-    class Program
+    public static class Program
     {
-        private const string Script = @"
-            var o = {};
-            o.Foo = 'bar';
-            o.Baz = 42.0001;
-            o.Blah = o.Foo + o.Baz;
-
-            if(o.Blah != 'bar42.0001') throw TypeError;
-
-            function fib(n){
-                if(n<2) {
-                    return n;
-                }
-
-                return fib(n-1) + fib(n-2);
-            }
-
-            if(fib(3) != 2) throw TypeError;
-        ";
-
-        static void Main()
+        public static void Main(string[] args)
         {
-            //const bool runIronJs = true;
-            const bool runJint = true;
-            const bool runJurassic = true;
-
-            const int iterations = 1000;
-            const bool reuseEngine = false;
-
-            var watch = new Stopwatch();
-
-
-            //if (runIronJs)
-            //{
-            //    IronJS.Hosting.CSharp.Context ironjs;
-            //    ironjs = new IronJS.Hosting.CSharp.Context();
-            //    ironjs.Execute(Script);
-            //    watch.Restart();
-            //    for (var i = 0; i < iterations; i++)
-            //    {
-            //        if (!reuseEngine)
-            //        {
-            //            ironjs = new IronJS.Hosting.CSharp.Context();
-            //        }
-
-            //        ironjs.Execute(Script);
-            //    }
-
-            //    Console.WriteLine("IronJs: {0} iterations in {1} ms", iterations, watch.ElapsedMilliseconds);
-            //}
-
-            if (runJint)
-            {
-                Engine jint;
-                jint = new Engine();
-                jint.Execute(Script);
-
-                watch.Restart();
-                for (var i = 0; i < iterations; i++)
-                {
-                    if (!reuseEngine)
-                    {
-                        jint = new Jint.Engine();
-                    }
-
-                    jint.Execute(Script);
-                }
-
-                Console.WriteLine("Jint: {0} iterations in {1} ms", iterations, watch.ElapsedMilliseconds);
-            }
-
-            if (runJurassic)
-            {
-                Jurassic.ScriptEngine jurassic;
-                jurassic = new Jurassic.ScriptEngine();
-                jurassic.Execute(Script);
-
-                watch.Restart();
-                for (var i = 0; i < iterations; i++)
-                {
-                    if (!reuseEngine)
-                    {
-                        jurassic = new Jurassic.ScriptEngine();
-                    }
-
-                    jurassic.Execute(Script);
-                }
-
-                Console.WriteLine("Jurassic: {0} iterations in {1} ms", iterations, watch.ElapsedMilliseconds);
-            }
+            BenchmarkSwitcher.FromAssembly(typeof(Program).GetTypeInfo().Assembly).Run(args);
         }
     }
-}
+}