与Roslyn的编译时间突然下降

时间:2015-02-19 13:05:45

标签: code-generation roslyn

我们正在使用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也没有接近任何限制,但我们偶尔会看到一些高峰:

enter image description here

Edit4:要对@pharring做出反应,我们不会编译二进制文件。而且我不确定它是否与源代码直接相关。这些编译时间并不总是很高。并且只在虚拟机上。我们在开发机器上看不到它。另一方面,它是一个很大的DLL。得到的dll是37 MB。我无法链接其他人看的源代码,但我会尝试进行转储。

0 个答案:

没有答案