Как 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, но я не могу заставить его вести себя последовательно.

0 ответов

Другие вопросы по тегам