.NET8 极致性能优化 VM

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: VM 是 CLR 的一部分,但是它不包括 GC 和 JIT。它主要的作用是进行类型的识别和 DLL (托管以及非托管)的加载。可以看到 VM 是一个比较重要的部分,.NET8 里面对它也进行了优化,属于核心级的优化。

前言

VM 是 CLR 的一部分,但是它不包括 GC 和 JIT。VM 主要作用是进行类型的识别和DLL(托管以及非托管)的加载。 可以看到 VM 是一个比较重要的部分,.NET8 里面对它也进行了优化,属于核心级的优化。

概述

.NET8 里面针对 VM 的其中一个优化是将指令集映射到 MethodDesc上,关于 MethodDesc 它是 CLR 里面所有托管方法的方法描述结构体。也即是描述方法所在的类,方法级别,方法是否被编译,方法签名信息,方法数据结构等等。

内存映射

关于内存映射这一点,之前提到过。参考文章:

这种优化主要是针对比如堆栈的遍历,委托创建的时候,提高它们的转换性能,而且是 无锁的状态(性能提升点)。从字面分析即可理解这种优化的程度是较高级别的。

1、委托创建的优化

看一个例子:

public class Tests
{
   
    public void InSerial()
    {
   
        for (int i = 0; i < 10_000; i++)
        {
   
            CreateDelegate<string>();
        }
    }

    public void InParallel()
    {
   
        Parallel.For(0, 10_000, i =>
        {
   
            CreateDelegate<string>();
        });
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    private static Action<T> CreateDelegate<T>() => new Action<T>(GenericMethod);

    private static void GenericMethod<T>(T t) {
    }
}

比如以上委托创建的操作,.NET7.NET8 性能对比:

Method Runtime Mean Ratio
InSerial .NET 7.0 1,868.4 us 1.00
InSerial .NET 8.0 706.5 us 0.38
InParallel .NET 7.0 1,247.3 us 1.
InParallel .NET 8.0 222.9 us 0.18

可以看到 .NET8 提升了 36 倍的性能。

2、分配器 ExecutableAllocator 的优化

另外一个优化是提高了 ExecutableAllocator 的性能,它叫做 分配器负责 CLR 中所有可执行内存相关的分配。比如说,JIT 用它来获取内存,把代码写入到获取的内存里,然后执行这些代码。当 ExecutableAllocator 获取的这段内存被映射的时候,它可以决定对这个内存进行读或者写,或者执行,或者其它的操作。ExecutableAllocator 维护一个缓存,通过减少缓存未命中的次数和减少这些缓存未命中时的成本来提高分配器的性能。

3、R2R 的优化

R2R 是预编译机器码的一种格式,AOT 编译和 JIT 编译是两个极端,一个是完全预编译,一个则是即时编译。R2R 介于这两者之间,如果检测到函数有预编译代码则进行 AOT 化的运行,如果没有则调用 JIT 进行即时编译运行。

这里优化的是 R2R 的启动时间,旨在减少 R2R 图像中验证类型所花费的时间,由于 R2R 图像中有专用的元数据,使得在 R2R 图像中查找泛型参数和嵌套类型变得更快,通过在方法描述中存储一个额外的索引,将 O(n^2) 的查找转变为 O(1) 的查找,以及确保 vtable 块始终被共享。

分配器 ExecutableAllocatorR2R 的优化是 C++ 级的,托管的 C# 代码无法完全呈现,所以这里就不上代码了。了解这些优化即可,更深入可以参考之前的文章。

转载声明:

目录
相关文章
|
5月前
|
人工智能 安全 索引
.NET8 极致性能优化 CHRL(CORINFO_HELP_RNGCHKFAIL)
.NET8 在 .NET7 的基础上进行了进一步的优化,比如 CHRL (全称:CORINFO_HELP_RNGCHKFAIL)优化技术,它是边界检查,在 .NET7 里面它已经进行了部分优化,但是 .NET8 里面它继续优化,类似人工智能,.NET8 能意识到某些性能问题,从而进行优化。
106 0
|
SQL 存储 .NET
一起谈.NET技术,如何对ASP.NET进行性能优化
  一、SqlDataRead和Dataset的选择   Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。
941 0
|
SQL 程序员 数据库
一起谈.NET技术,DataReader 程序性能优化
  随着 .NET 平台上,LINQ、ORM 框架、Dynamic Data、... 各种数据访问技术不断推陈出新,程序员也一直追着新技术跑,但对底层和代码细节却越来越难以掌控。当项目性能需要调优时,通常也只能对数据库加入更多索引,而多数人已难以对数据访问的代码优化,且手写 SQL 语句的功力似乎也持续退化中。
1474 0
|
SQL 大数据 数据库
一起谈.NET技术,Sql Server性能优化——Partition(管理分区)
  在企业管理器中,虽然有“管理分区”的菜单,里面的内容却可能与你的预想不同,这里并没有提供直接对分区进行操作的方法,所以一些普通的操作,比如“增加分区”、“删除分区”之类的操作就需要通过脚本实现了。   增加分区(Split Partition)   “增加分区”事实上就是将现有的分区分割开,基于此,在SQL Server中应用的是Split操作。
1105 0
|
缓存 异构计算
一起谈.NET技术,Silverlight性能优化纪要
  Silverlight作为微软为富网络应用所做的一个全新的架构,其优秀的表现力让开发者和用户感受到了强烈的冲击,无数的开发者为其着迷,同时微软的广大设计者也在不断地为其完善和充实,同时Silverlight团队也积极的构建Silverlight 5,其初步的版本已在 http://channel9.msdn.com/Series/Silverlight-Firestarter做了演示,从中你可以感受到Silverlight未来之路。
1076 0
|
缓存 异构计算
Silverlig“.NET研究”ht性能优化纪要
  Silverlight作为微软为富网络应用所做的一个全新的架构,其优秀的表现力让开发者和用户感受到了强烈的冲击,无数的开发者为其着迷,同时微软的广大设计者也在不断地为其完善和充实,同时Silverlight团队也积极的构建Silverlight 5,其初步的版本已在 http://channel9.msdn.com/Series/Silverlight-Firestarter做了演示,从中你可以感受到Silverlight未来之路。
1053 0
|
SQL 存储 测试技术
.Net+SQL Server企业应用性能优化笔记—精确查找瓶颈
首先我们需要部署一个测试环境,将Web项目的源代码拷到测试环境Web服务器IIS上,使得可以直接通过IE访问我们的网站。SQL Server环境可以部署在同一台机器上,条件允许的话有专门的数据库测试服务器那当然是更好,没有也无所谓。
980 0
|
3天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
48 0