0

我最终将其简化为一个非常简单的测试(来自一个巨大的 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 的东西,但我无法让它表现得始终如一。

4

0 回答 0