AngleSharp / AngleSharp.Js

:angel: Extends AngleSharp with a .NET-based JavaScript engine.

Home Page:https://anglesharp.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Slow initialization when getting Jint instance

bakkar1989 opened this issue · comments

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();
     }

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.