从版本5.14开始,Mono显然默认情况下启用LLVM的使用(这就是mono --version
告诉我的内容)。
我还安装了软件包llvm
,我想知道是否有办法确定Mono是否实际使用LLVM而不是其内置的JIT 。
实际上,我在想两种检测方法:
编辑2018-10-12 :有趣的是,从版本5.16开始,不再支持LLVM。
答案 0 :(得分:0)
我找到了解决方案。但是,目前看来Mono在LLVM上非常不稳定,因此以下C#代码是理论上的(我只能在没有LLVM的情况下进行检查)。
感谢arnt,他给了我检查映射库的想法。
如果mono
运行时打开名为libmono-llvm.so
的库,则将加载LLVM。
由此,我们可以推断出bash方式和C#来检测是否正在使用LLVM。
警告:仅在Linux上有效(因为它使用了procfs)
使用mono
pid作为$1
参数,如果使用LLVM,则以下命令返回1
,否则返回0
。
find /proc/$1/map_files/ -maxdepth 1 -type l -ls | grep libmono-llvm.so | head -1 | wc -l
using System.Diagnostics;
using System.IO;
using Mono.Unix;
public static class LlvmInformation
{
private static bool? _isLlvmEnabled;
/// <summary>
/// Gets a value indicating whether Mono uses LLVM.
/// </summary>
/// <value>
/// <c>true</c> if this instance is LLVM enabled; otherwise, <c>false</c>.
/// </value>
public static bool IsLlvmEnabled
{
get
{
if (!_isLlvmEnabled.HasValue)
_isLlvmEnabled = LoadLlvmEnabled();
return _isLlvmEnabled.Value;
}
}
private static bool LoadLlvmEnabled()
{
var pid = Process.GetCurrentProcess().Id;
var mapFilesDirectory = $"/proc/{pid}/map_files";
var mapFiles = Directory.EnumerateFiles(mapFilesDirectory);
foreach (var mapFile in mapFiles)
{
var symbolicLinkInfo = new UnixSymbolicLinkInfo(mapFile);
if (symbolicLinkInfo.FileType == FileTypes.SymbolicLink
&& symbolicLinkInfo.GetContents().Name.Contains("libmono-llvm.so"))
return true;
}
return false;
}
}
祝你好运!