我们正在使用Roslyn(nuget包Microsoft.CodeAnalysis.CSharp,版本1.0.0.0-beta2)来编译生成的代码。我们在内存中有5000个CSharp文件作为String,并将它们转换为SyntaxTree' s:
f => CSharpSyntaxTree.ParseText(f)
然后我们创建一个编译:
CSharpCompilation compilation = CSharpCompilation.Create(assemblyName ,
syntaxTrees: files.Keys,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,
optimizationLevel: OptimizationLevel.Release
)
);
然后我们编译:
compilation.Emit(
Path.Combine(assemblyOutputPath, assemblyName + ".dll"),
Path.Combine(assemblyOutputPath, assemblyName + ".pdb"));
有时需要几分钟(如5到10分钟)。但有时我们会看到多个小时的编译时间(2小时到6小时)。
我该如何调试/追踪?是否有任何API可以从Roslyn获取详细信息?
编辑:我们在具有4 GB RAM的虚拟Windows 2012 R2实例上运行此过程。我不确定这种设置会产生什么影响。
Edit2:是的,这个过程消耗了大量的内存和CPU(我看到使用率达到1500 MB ram)。但是在它很慢的情况下,据我所知,仍然有很多记忆。
编辑3:我们已经开启了包含效果计数器的流程。内存使用似乎很好,没有任何限制。 CPU也没有接近任何限制,但我们偶尔会看到一些高峰:
Edit4:要对@pharring做出反应,我们不会编译二进制文件。而且我不确定它是否与源代码直接相关。这些编译时间并不总是很高。并且只在虚拟机上。我们在开发机器上看不到它。另一方面,它是一个很大的DLL。得到的dll是37 MB。我无法链接其他人看的源代码,但我会尝试进行转储。