提问者:小点点

将.NET framework转换为.NET核心,性能损失


这是.NET framework 4.8---->.NET core 5.0

我有一个个人的国际象棋引擎,我正在工作,昨天我决定从.NET framework切换到.NET Core。

在这个过程中我没有更改1行代码,完全相同的代码。

当我这样做的时候,我注意到损失了几个百分点,在2%到5%之间(目前为止)

这足以看出perft每秒平均有500,000到200,000步的差异(如果你不知道这是什么,谷歌一下,这是国际象棋引擎的一种测试)

我所做的是,我创建了一个全新的.NET核心解决方案,其中包含两个项目。

  1. 控制台应用程序(这一个是VB)<---控制引擎的一种方法
  2. 类项目(C#)<---引擎

这是#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,但没有成功

问题是,有人知道我做错了什么吗?

现在,基于我目前的结果,我将继续使用框架,除非我能弄清楚到底发生了什么。


共1个答案

匿名用户

从.NETCORE 3.1升级到.NET5时会出现已知性能回归。
参考:https://github.com/dotnet/runtime/issues/36907
它还没有修复,就像您一样,我坚持我当前的框架(Core3.1),直到.NET5优化。

所以简而言之:不,不是你。