Как jint замедляет чистый код clr, который он вызывает
В конце концов я свел это к невероятно простому тесту (от огромной системы с 500000 строк). Когда я запускаю это тестовое приложение
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, но я не могу заставить его вести себя последовательно.