私は最終的にこれを信じられないほど単純なテストに落とし込みました (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 によって呼び出され、2 番目の呼び出しが直接呼び出されることです。Foo のループに含まれる jint/js/ などはありません。jint 経由で呼び出すと、コードの実行に 2 倍から 3 倍の時間がかかります!
ジントが何かを環境に挿入したように感じますが、スタックにあると速度が低下しますが、何がわかりません。いくつかの CAS 呼び出しがあり、私はそれらを取り出しましたが、違いはありませんでした。私は困惑しています。
CASのような気がしますが、一貫して動作させることはできません。