16

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

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

那么是否可以针对现有的 C# .NET 项目使用 Mono/LLVM 以获得更快的 Windows 或 Unix 应用程序?是不是很容易,还是您必须重构/修改应用程序代码?这甚至可以在常规的 .NET Framework 下工作,还是专门针对 Mono Framework 项目?考虑到这一点,有人说:

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

4

4 回答 4

4

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

于 2012-07-30T10:32:11.610 回答
3

您需要做的第一件事是在分析器下运行您的程序,然后查看结果以找到经常调用的热点或方法。

对于普通的普通桌面应用程序,依靠 .NET/Mono 中的低级优化不会在显着性能方面获得太多收益。这不是 C/C++。

于 2012-07-30T20:31:05.677 回答
2

虽然在这种情况下,基于 CPU 或时间的分析器将帮助您将指标与基准进行比较,但热路径或方法热点不会在更改编译器时发生变化,而是通过测试的不同执行路径发生变化。

热路径、具有高独占字节的方法是应用程序代码的产物,而不是代码在本机 CPU 上的翻译和优化方式。话虽如此,使用 Windows 事件跟踪 (ETW) 的 perfview 等工具提供了特定于 JIT 的统计信息,并且可以使用大量采样或基于时间的分析器进行微基准测试,但这可能很难做到正确。

于 2015-01-31T23:21:32.610 回答
1

我的基准测试表明,Mono 执行相同任务所需的时间通常是 MS .NET 的 2 倍左右。因此,使用 LLVM 让 Mono 速度提高 20% 并不足以使其赶上微软。此外,由于某种原因,当我在 Windows 上使用 --llvm 标志时,几乎没有什么区别;也许 LLVM 甚至出于某种原因在 Windows 上被禁用(或者早在 2011 年我做基准测试时)。

于 2013-05-22T18:48:13.087 回答