我最终将其简化为一个非常简单的测试(来自一个巨大的 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/ 等。当通过 jint 调用时,运行代码需要 2 到 3 倍的时间!
感觉就像 jint 在环境中插入了一些东西,当它在堆栈中时会减慢速度,但我看不到是什么。它有一些 CAS 调用,我把它们拿出来了,没有任何区别。我难住了。
感觉就像是 CAS 的东西,但我无法让它表现得始终如一。