我最终把它减少到一个非常简单的测试(来自一个巨大的500,000线系统)。当我运行这个测试应用程序时
using Jint;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var jint = new JintEngine();
jint.DisableSecurity();
jint.MaxStatements = 1000;
jint.SetFunction("foo",new Action( Foo));
jint.Run("foo();");
Foo();
}
public static void Foo()
{
Debug.WriteLine("foo");
var sw = new Stopwatch();
sw.Start();
for (int j = 0; j < 500000; j++)
{
var k = new Byte[50];
}
sw.Stop();
Debug.WriteLine(sw.ElapsedTicks);
}
}
}
我明白了
foo
55150
foo
13279
请注意,唯一的区别是第一个Foo调用是由jint调用的,第二个是直接调用的。 Foo中的循环中没有涉及jint / js / etc.通过jint调用时,运行代码需要2到3倍的时间!
感觉就像jint在环境中插入一些东西,当它在堆栈中时会减慢速度,但是我看不清楚是什么。它有一些CAS电话,我拿出来,没有什么区别。我很难过。
这真的感觉就像CAS的东西,但我不能让它表现得一致。