您能否使用Mono/LLVM生成比Microsoft'更快的.NET应用程序;s C#编译器?

您能否使用Mono/LLVM生成比Microsoft'更快的.NET应用程序;s C#编译器?,c#,performance,optimization,mono,llvm,C#,Performance,Optimization,Mono,Llvm,该项目能够使用LLVM编译器后端,它有一些非常强大的优化来编译C#.NET项目,这使它在计算密集型应用程序中运行速度提高了约20% 除了Mono内置的JIT编译器外,Mono现在还可以使用LLVM作为代码生成的后端。这使Mono能够从LLVM中完成的所有编译器优化中获益。例如,SciMark得分从482到610 那么,有没有可能将现有的C#.NET项目定位为使用Mono/LLVM,以便为Windows或Unix获得更快的应用程序?这有那么简单吗?还是你必须重构/修改应用程序代码?这会在常规的.N

该项目能够使用LLVM编译器后端,它有一些非常强大的优化来编译C#.NET项目,这使它在计算密集型应用程序中运行速度提高了约20%

除了Mono内置的JIT编译器外,Mono现在还可以使用LLVM作为代码生成的后端。这使Mono能够从LLVM中完成的所有编译器优化中获益。例如,SciMark得分从482610

那么,有没有可能将现有的C#.NET项目定位为使用Mono/LLVM,以便为Windows或Unix获得更快的应用程序?这有那么简单吗?还是你必须重构/修改应用程序代码?这会在常规的.NET框架下工作,还是专门针对Mono框架项目?考虑到这一点,有人说:

这种额外的性能是有代价的:使用LLVM进行JIT编译会消耗更多的时间和内存


LLVM后端连接到Mono的JIT编译器(在运行应用程序时将IL程序集转换为本机程序集),因此您需要使用Mono运行应用程序。

您需要做的第一件事是运行您的程序,然后查看结果以查找调用过多的热点或方法


对于一个普通的桌面应用程序来说,依靠.NET/Mono中的低级优化并不能获得显著的性能。这不是C/C++。

表明Mono通常需要大约2倍的时间来完成与MS.NET相同的任务。因此,使用LLVM使Mono速度提高20%还不足以赶上微软。另外,由于某种原因,当我在Windows上使用--llvm标志时,实际上没有什么区别;也许LLVM甚至因为某种原因在Windows上被禁用了(或者是在2011年我做基准测试时被禁用了)。

在这种情况下,CPU或基于时间的探查器将帮助您将度量与基准测试进行比较,但在更改编译器时,热路径或方法热点不会改变,而是通过不同的测试执行路径


热路径、具有高排他字节的方法是应用程序代码的工件,而不是在本机CPU上如何翻译和优化代码。话虽如此,诸如使用Windows事件跟踪(ETW)的perfview等工具提供了JIT特定的统计数据,许多采样或基于时间的探查器可用于微基准标记,但这可能是一个挑战。Mono.NET Framework与Microsoft在Windows 7上的实现有很大不同吗?它可以与MS.NET 4.0交换吗?将现有的.NET应用移植到Mono上有多难?Mono框架的优点/缺点是什么?这是一个很难回答的问题,因为在大多数情况下答案是“它取决于”——取决于你的应用程序、复杂性、它使用的是什么等等。但老实说,我个人并不期望Mono在Windows上工作得更好,因为它的主要平台是Linux,OS X和mobile.Mono速度非常快,但依靠JIT优化无法赢得任何正面的性能战。Mono在.NET环境中运行良好。事实上,它与大多数以MS为目标的DLL等兼容。我发现,在Windows操作系统上,Mono二进制文件的性能仍然优于Linux,至少对于自托管的“ASP”或“MVC”,我不是说普通的应用程序。这个问题是专门针对计算密集型应用程序的。然后你需要确保你已经为这项工作选择了正确的工具,我这样说是因为有人强烈支持mono,并且几乎每天都使用它,效果非常好,但是如果你的目标是实时/密集型处理,mono或.Net可能不是正确的工具。或者,简单地获得更多的RAM和CPU内核可能会更便宜(时间和金钱)。@IanNorton:我不完全同意这一点。如果你知道你在做什么,那么就可以非常接近C++应用程序的速度。这需要使用--llvm和-O=unsafe(以避免数组边界检查)。可能还需要调整内联限制。我已经将数值算法与上述算法进行了并排比较,并发现性能差异可以忽略不计(4-7%)。也就是说,LLVM在某些特定的自动矢量化情况下还没有达到gcc的要求。它正在向前发展,希望mono fork能够随着时间的推移引入这些变化。顺便说一句,除了使用--llvm之外,还有其他一些有帮助的优化,特别是对于数值应用。建议尝试mono--llvm-O=unsafe。此外,可以通过设置一个环境变量来增加内联,比如:MONO_INLINELIMIT=128您在谈论什么版本的LLVM。3.3刚刚推出了许多针对循环的多线程矢量化优化。我不知道当时Mono中嵌入了哪个版本的LLVM。无论如何,我猜带LLVM的Mono仍然不如.NET快,因为他们可能无法实现所有可能的优化,要么是因为它过度损害了启动性能,要么是因为Mono的结构限制。我不认为LLVM本身是罪魁祸首;当然,LLVM在理论上可以比.NET的JIT生成更快的代码,编译C++时,它也能做到这一点。我不明白这个“答案”和这个问题有什么关系。