2

我正在尝试在运行时创建多个程序集。我正在使用 Roslyn 串行编译每个程序集。

我无法利用多线程,因为 Roslyn 在内部使用多线程来编译单个 dll。使用 Roslyn 编译单个 dll 的时间比使用 CodeDom 的要少,但是由于使用 CodeDom 我可以并行编译多个 dll,因此 CodeDom 的实际时间要少得多。

我尝试将 Roslyn 编译的并发构建选项设置为 false,然后在我的代码中使用多线程,但这也效率不高,因为现在单个 dll 的编译时间更长。我想知道是否有解决此问题的方法

时序分析更新:

我有一个 8 核处理器。我在磁盘上有不同的文件集用于编译 72 个 dll。

在第一种情况下,我从文件创建语法树,创建引用,创建选项并使用 Emit 使用简单foreach循环以串行方式为每个 dll 编译 dll。总耗时 488589 ms

在第二种情况下,我使用parallel.ForEachwithMaxDegreeOfParallelism = 7并创建语法树、创建引用、创建选项并在循环中使用 Emit 编译 dll。总耗时 514481 ms

在这两种情况下,并发构建选项都是默认的:True。

如您所见,使用多线程时没有观察到任何收益。

4

0 回答 0