瀏覽代碼

add benchmarks from https://rushfrisby.com/net-javascript-engine-performance-results/

Marko Lahma 7 年之前
父節點
當前提交
12a71dffa8

+ 24 - 0
Jint.Benchmark/ArrayBenchmark.cs

@@ -0,0 +1,24 @@
+using BenchmarkDotNet.Attributes;
+using BenchmarkDotNet.Configs;
+using BenchmarkDotNet.Jobs;
+
+namespace Jint.Benchmark
+{
+    [Config(typeof(Config))]
+    public class ArrayBenchmark : SingleScriptBenchmark
+    {
+        private class Config : ManualConfig
+        {
+            public Config()
+            {
+                // if Jint array performance gets better we can go towards defaul 16/16
+                Add(Job.ShortRun.WithInvocationCount(4).WithUnrollFactor(4));
+            }
+        }
+
+        protected override string Script => "var ret=[],tmp,num=500,i=1024;for(var j1=0;j1<i*15;j1++){ret=[];ret.length=i}for(var j2=0;j2<i*10;j2++){ret=new Array(i)}ret=[];for(var j3=0;j3<i;j3++){ret.unshift(j3)}ret=[];for(var j4=0;j4<i;j4++){ret.splice(0,0,j4)}var a=ret.slice();for(var j5=0;j5<i;j5++){tmp=a.shift()}var b=ret.slice();for(var j6=0;j6<i;j6++){tmp=b.splice(0,1)}ret=[];for(var j7=0;j7<i*25;j7++){ret.push(j7)}var c=ret.slice();for(var j8=0;j8<i*25;j8++){tmp=c.pop()}var done = true;";
+
+        [Params(1)]
+        public override int N { get; set; }
+    }
+}

+ 6 - 37
Jint.Benchmark/EvaluationBenchmark.cs

@@ -4,12 +4,9 @@ using Jurassic;
 namespace Jint.Benchmark
 {
     [MemoryDiagnoser]
-    public class EvaluationBenchmark
+    public class EvaluationBenchmark : SingleScriptBenchmark
     {
-        private Engine sharedJint;
-        private ScriptEngine sharedJurassic;
-
-        private const string Script = @"
+        protected override string Script => @"
             var o = {};
             o.Foo = 'bar';
             o.Baz = 42.0001;
@@ -26,39 +23,11 @@ namespace Jint.Benchmark
             }
 
             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);
-            }
-        }
+            var done = true;
+        ";
 
-        [Benchmark]
-        public void Jurassic()
-        {
-            for (var i = 0; i < Iterations; i++)
-            {
-                var jurassic = ReuseEngine ? sharedJurassic : new ScriptEngine();
-                jurassic.Execute(Script);
-            }
-        }
+        [Params(20)]
+        public override int N { get; set; }
     }
 }

+ 1 - 0
Jint.Benchmark/Jint.Benchmark.csproj

@@ -17,5 +17,6 @@
     <ProjectReference Include="..\Jint\Jint.csproj" />
     <PackageReference Include="BenchmarkDotNet" Version="0.10.11" />
     <PackageReference Include="Jurassic" Version="3.0.0-alpha2" />
+    <PackageReference Include="NiL.JS.NetCore" Version="2.5.1200" />
   </ItemGroup>
 </Project>

文件差異過大導致無法顯示
+ 20 - 0
Jint.Benchmark/LinqJsBenchmark.cs


+ 7 - 0
Jint.Benchmark/MinimalScriptBenchmark.cs

@@ -0,0 +1,7 @@
+namespace Jint.Benchmark
+{
+    public class MinimalScriptBenchmark : SingleScriptBenchmark
+    {
+        protected override string Script => "var done = true;";
+    }
+}

+ 72 - 0
Jint.Benchmark/SingleScriptBenchmark.cs

@@ -0,0 +1,72 @@
+using BenchmarkDotNet.Attributes;
+using Jurassic;
+using NiL.JS.Core;
+
+namespace Jint.Benchmark
+{
+    [MemoryDiagnoser]
+    public abstract class SingleScriptBenchmark
+    {
+        private Engine sharedJint;
+        private ScriptEngine sharedJurassic;
+        private Context sharedNilJs;
+
+        protected abstract string Script { get; }
+
+        [Params(1)]
+        public virtual int N { get; set; }
+
+        [Params(true, false)]
+        public bool ReuseEngine { get; set; }
+
+        [GlobalSetup]
+        public void Setup()
+        {
+            sharedJint = new Engine();
+            sharedJurassic = new ScriptEngine();
+            sharedNilJs = new Context();
+        }
+
+        [Benchmark]
+        public bool Jint()
+        {
+            bool done = false;
+            for (var i = 0; i < N; i++)
+            {
+                var jintEngine = ReuseEngine ? sharedJint : new Engine();
+                jintEngine.Execute(Script);
+                done |= jintEngine.GetValue("done").AsBoolean();
+            }
+
+            return done;
+        }
+
+        [Benchmark]
+        public bool Jurassic()
+        {
+            bool done = false;
+            for (var i = 0; i < N; i++)
+            {
+                var jurassicEngine = ReuseEngine ? sharedJurassic : new ScriptEngine();
+                jurassicEngine.Execute(Script);
+                done |= jurassicEngine.GetGlobalValue<bool>("done");
+            }
+
+            return done;
+        }
+
+        [Benchmark]
+        public bool NilJS()
+        {
+            bool done = false;
+            for (var i = 0; i < N; i++)
+            {
+                var nilcontext = ReuseEngine ? sharedNilJs : new Context();
+                nilcontext.Eval(Script);
+                done |= (bool) nilcontext.GetVariable("done");
+            }
+
+            return done;
+        }
+    }
+}

部分文件因文件數量過多而無法顯示