gpt4 book ai didi

c# - CompiledCode.Execute 在第一次迭代期间需要很长时间

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:02 24 4
gpt4 key购买 nike

我正在将小脚本嵌入到 C# 应用程序中。
为了提高性能,我在应用程序启动时编译它们。

public CompiledCode CompileScript(string script)
{
return engine.CreateScriptSourceFromString(script).Compile();
}

然后将 CompiledCode 实例存储在字典中,以便我以后可以重用它们。

当执行它们的时候,我使用类似的东西:

result = code.Execute(scope);  

其中 scope 是 ScriptScope 的一个实例,由一个简单的辅助类维护。
该范围是在创建助手实例时设置的,以便正确添加脚本可用的变量和程序集:

if (variables != null)
{
scope = engine.CreateScope(variables);
}
else
{
scope = engine.CreateScope();
}


if (assemblies != null)
{
assemblies.ForEach(a => scope.Engine.Runtime.LoadAssembly(a));
}

基本上,一个程序集列表被传递给助手类的构造函数,我在不同的地方重用了助手类的实例。 (不是静态类,因为我确实需要针对特定​​场景使用多个帮助程序实例,但在这个问题的上下文中,我们讨论的是单个实例)

在普通 PC 上使用它时,编译/运行代码的开销可以忽略不计。
但是,我在 RaspberryPI 上运行它并注意到第一次特定的脚本被执行,需要很长时间。 (2 行脚本很容易长达 40 秒)

相同 CompiledCode 实例的后续执行执行得非常快(200 毫秒)。

所以我有已经编译过的代码(奇怪的是,第一次编译也非常快),但是在给定的 CompiledCode 实例上第一次调用 Execute() 需要很长时间。

现在我想知道,Execute() 第一次做了什么,有没有办法在不实际执行代码的情况下提前执行它正在做的事情?在编译和实际运行代码之间似乎还有一个额外的步骤。

我在想这可能与我重用
定义的范围有关helper 类,但当然如果我只是在执行时使用默认范围
我没有任何变量和程序集引用。

更新:

Running it on a RaspberryPI means I'm using Mono.
More specifically Mono 2.10.8.1 (Debian 2.10.8.1-8)
I cannot update Mono as I'm relying on a very specific version of MonoGame
that only works with this exact version of Mono at the time of writing.

最佳答案

冒险猜测,我会说正在发生的事情是 IronPython 程序集正在 JIT 化。唯一的问题是还有其他调用 IronPython 的代码路径,我不知道 Mono 的 JIT 是在程序集级别还是在类型/方法级别工作。您可以尝试在 IronPython 和 DLR 程序集上执行 AOT,看看是否有帮助。

关于c# - CompiledCode.Execute 在第一次迭代期间需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15517511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com