当前位置: 首页 > 知识库问答 >
问题:

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

呼延庆
2023-03-14

这是.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个答案

上官华池
2023-03-14

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

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

 类似资料:
  • 有没有一种方法可以轻松地将面向.NETCore2.0的类库转换为.NET标准? 如果我理解正确,如果有人想在针对不同.NET框架(例如.NET Framework,.NET Core,Xamarin等)的项目中最大限度地提高类库的可重用性,那么以.NET Standard为目标的更好主意 - 前提是所有必需的API都可以在将要定位的.NET Standard版本中提供。 这就是我想将类库从. NE

  • 我是新来的。 我已经开始将我的核心PHP项目转换为laravel 7。我被一些查询问题卡住了。 核心问题是: 我也把它改装成了拉威尔·布伊德。 但我对select列有异议。 请让我知道我错在哪里。 我最后的疑问是 错误是:未找到列:1054字段列表中的未知列'计数(DISTINCT(unitid))'

  • .NET核心和ASP.NET核心到底有什么区别?

  • 最近我们的一个jvm崩溃了。生成了一个核心文件。我想看看那个文件,找出坠机的原因。但我无法分析核心。我用jmap分析了它。然后写下命令-: jmap-转储:格式=b,文件=heap.hprof核心22234 但是我一直在例外: 从可执行核心附加到核心22234,请等待...附加到核心文件的错误: Windbg错误: OpenDumpFile失败! 我的windows系统中有核心文件。我想在那里分析

  • 我需要帮忙。因此,我需要从AWS Lambda获得从AWS IOT Core订阅(触发)的主题名称。这是我的lambda代码: 我在云观察中看到,我正确地接收了来自MQTT的有效负载数据,并正确地触发了。所以这就是我的主题: 我需要,因为该主题将包含像机器系列的基本信息,例如'AWS/XYZ'。如何读取主题名称并从publish MQTT中读取'XYZ'?我需要得到主题名称在AWS lambda。

  • 问题内容: 我的网站服务正在将DateTime返回到jQuery调用。服务以以下格式返回数据: 如何将其转换为JavaScript友好的日期? 问题答案: 返回的时间是自纪元以来的毫秒数。您可以这样做: 有关如何精确设置日期格式的信息,请参见http://www.w3schools.com/jsref/jsref_obj_date.asp上的完整参考。 您可以通过解析整数来去除非数字: 或应用以下