AngleSharp / AngleSharp.Js

:angel: Extends AngleSharp with a .NET-based JavaScript engine.
https://anglesharp.github.io
MIT License
103 stars 22 forks source link

Slow initialization when getting Jint instance #72

Open bakkar1989 opened 3 years ago

bakkar1989 commented 3 years ago

I am trying to make use of Jint object to pass a custom variable from c# to javascript.

When calling the method "GetOrCreateJint" to get the instance it slows down by 300 - 400 ms on my laptop.

Also i tried to create 100 instances to use as pooling but its taking over 2GB of memory.

Are these two scenarios expected or there is a workaround?

    static List<(IDocument Dom, Engine Js)> engineList = new List<(IDocument Dom, Engine Js)>();
        public static void TestSpeed()
        {
            for (int i = 0; i < 100; i++)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                var config = Configuration.Default.WithJs();
                var context = BrowsingContext.New(config);

                var jsEngine = context.GetService<JsScriptingService>();

                var doc = context.OpenAsync(req => req.Content("<html><head></head><body></body></html>")).Result;

                // slow loading
                var engine = jsEngine.GetOrCreateJint(doc);

                engine.SetValue("myVar", "value");

                // 100 instances == 2Gb Memory
                engineList.Add((doc, engine));

                sw.Stop();
                Console.WriteLine(i + " - " + sw.ElapsedMilliseconds);
            }
            Console.ReadLine();
        }
FlorianRappl commented 3 years ago

There is quite some lookup and mapping done when the whole instance is scaffolded. Depending on your .NET runtime this may take a while.

So its expected to eat memory and to take a while. I guess it could be reduced a bit, but not by much as some of the boundary conditions (managed code, dynamic integration, interpreter) cannot be taken away.