这是.NET framework 4.8---->.NET core 5.0
我有一个个人的国际象棋引擎,我正在工作,昨天我决定从.NET framework切换到.NET Core。
在这个过程中我没有更改1行代码,完全相同的代码。
当我这样做的时候,我注意到损失了几个百分点,在2%到5%之间(目前为止)
这足以看出perft每秒平均有500,000到200,000步的差异(如果你不知道这是什么,谷歌一下,这是国际象棋引擎的一种测试)
我所做的是,我创建了一个全新的.NET核心解决方案,其中包含两个项目。
这是#1框架的vbproj:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<DefineTrace>true</DefineTrace>
<OutputPath>..\..\Build\</OutputPath>
<RemoveIntegerChecks>true</RemoveIntegerChecks>
<DocumentationFile>
</DocumentationFile>
<Optimize>true</Optimize>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
这是#2框架的csproj:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Build\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoStdLib>false</NoStdLib>
<UseVSHostingProcess>false</UseVSHostingProcess>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Prefer32Bit>false</Prefer32Bit>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
这是#1核心的vbproj:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
<PlatformTarget>x64</PlatformTarget>
<RemoveIntegerChecks>true</RemoveIntegerChecks>
<DebugSymbols>true</DebugSymbols>
<DebugType>pdbonly</DebugType>
<DefineDebug>false</DefineDebug>
</PropertyGroup>
这是#2核心的csproj:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DebugType>pdbonly</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
对于这些时间线,我将运行时限制在cpu的一个特定核心,以确保它处于相同的行为下。无论有没有这个限制,我每次都可以复制
在运行黄圈中的5个测试之前,我先调用引擎做一个热身
我确实读过这篇文章:[TieredCompility]带有热循环的冷方法在分层时可能运行得更慢,我试图打开DisableTier0Jit或关闭TieredCompility,但没有成功
问题是,有人知道我做错了什么吗?
现在,基于我目前的结果,我将继续使用框架,除非我能弄清楚到底发生了什么。
从.NETCORE 3.1升级到.NET5时会出现已知性能回归。
参考:https://github.com/dotnet/runtime/issues/36907
它还没有修复,就像您一样,我坚持我当前的框架(Core3.1),直到.NET5优化。
所以简而言之:不,不是你。