可以为可以卸载的动态编译代码获得本机性能吗?

时间:2015-06-25 04:03:19

标签: c# performance appdomain dynamic-compilation compileassemblyfromsource

我有一个函数,它使用类似树状结构的字典来匹配以几百克/秒的速度进入的传入结构。

它已经很快了,但它需要更快。为了通过以最高性能的方式编译这段代码来衡量它将获得多快的速度,我使用嵌套的switch语句对特定的字典树进行了硬编码(在这种情况下,切换{{1 s),并将其与字典样式进行比较。正如您所想,性能改进是巨大的:硬编码交换机版本只需要动态字典版本的CPU时间的20%。

由于树是在运行时动态创建的,并且时不时地发生变化,我认为每次更改时,我都可以在运行时将树动态地CompileAssemblyFromSource转换为switch-statement版本,我相信我会得到与我的硬编码版本给出的完全相同的性能 - 除了可能需要进行虚拟方法调用的开销,而不是调用硬编码函数时可以执行的静态函数调用。

问题是,这样生成的代码无法从内存中卸载,因此leak会随着时间推移,除非我在自己的AppDomain中创建代码,允许我通过卸载整个代码来unload应用程序域。

这里有一个问题:Communication between AppDomains is more expensive而不是单个AppDomain中的问题。我假设编组开销会(超过?)破坏switch语句的增益。

那么有没有办法获得本机性能,对于这样一个动态变化的问题,而不会泄漏内存?

或者说.net中没有办法动态自适应和静态快速? (当然,为了理解这一点,必须确保调用的数量远远超过相关代码的动态。)

N.B。我并不关心编译结构的时间 - 它可能需要多长时间。

0 个答案:

没有答案