广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.Net性能调优-ArrayPool详情
  • 290
分享到

.Net性能调优-ArrayPool详情

2024-04-02 19:04:59 290人浏览 安东尼
摘要

目录1、使用2、Shared2.1特点2.2耗时对比2.3示例(前端文件通过后端api上传OSS)3、Create()1、使用 获取缓冲池实例 :Create / Shar

1、使用

  • 获取缓冲池实例 :Create / Shared var pool=ArrayPool[byte].Shared
  • 调用缓冲池实例 :Rent() 函数,租用缓冲区空间 byte[] array=pool.Rent(1024)
  • 调用缓冲池实例 :Return(array[T]) 函数,归还租用的空间 pool.Return(array)

2、Shared

Shared返回为一个静态共享实例,实际返回了一个 TlsOverPerCoreLockedStacksArrayPool


internal sealed class TlsOverPerCoreLockedStacksArrayPool<T> : ArrayPool<T>
{
    private static readonly TlsOverPerCoreLockedStacksArrayPool<T> s_shared = new TlsOverPerCoreLockedStacksArrayPool<T>();

    public static ArrayPool<T> Shared => s_shared;
}

2.1特点

租用数组长度不可超过 2^20( 1024*1024 = 1 048 576),否则会从GC中重新开辟内存空间
Rent 租用数组实际返回的长度可能比请求的长度大,返回长度一是(16*2^n)
Return
归还缓冲区的时候,如果不设置 clearArray ,下一个租用者可能会看到之前的填充的值(在返回的数组长度刚好是下一个租用者请求的长度时会被看到)
缓冲池的内存释放不是实时释放,在缓冲区空闲时,大概10到20秒之后,会随着第2代GC一起释放,分批释放
并发数量持续增长时,缓冲池占用的内存空间也会持续增长,而且似乎没有上限

2.2耗时对比


private static void TimeMonitor()
{
    //随机生成3000个数组的长度值
    var sizes = new int[30000];
    Parallel.For(0, 10000, x => { sizes[x] = new Random().Next(1024 * 800, 1024 * 1024); });

    //缓冲池方式租用数组
    var gcAllocate0 = GC.GetTotalAllocatedBytes();
    var watch = new Stopwatch();
    Console.WriteLine("start");
    watch.Start();
    for (int i = 0; i < 10000; i++)
    {
        //CreateArrayByPool(ArrayPool<int>.Shared, 1024 * 1024,sizes[i], false);

        var arr = ArrayPool<int>.Shared.Rent(sizes[i]);
        for (int j = 0; j < sizes[i]; j++)
        {
            arr[j] = i;
        }
        ArrayPool<int>.Shared.Return(arr, true);
    }
    var time1 = watch.ElapsedMilliseconds;
    var gcAllocate1 = GC.GetTotalAllocatedBytes(true);

    //new 方式分配数组空间
    watch.Restart();
    for (int i = 0; i < 30000; i++)
    {
        //CreateArrayDefault(i, sizes[i], false);
        var arr = new int[sizes[i]];
        for (int j = 0; j < sizes[i]; j++)
        {
            arr[j] = i;
        }
    }
    var time2 = watch.ElapsedMilliseconds;
    var gcAllocate2 = GC.GetTotalAllocatedBytes(true);

    Console.WriteLine("ArrayPool方式创建数组耗时:" + time1 + "  Gc总分配量" + (gcAllocate1 - gcAllocate0));
    Console.WriteLine("默认方式创建数组耗时:" + time2 + "  Gc总分配量" + (gcAllocate2 - gcAllocate1 - gcAllocate0));
}

内存使用截图:左侧没有波动的横线是缓冲池执行的过程,右侧为手动创建数组的执行过程

执行结果:

ArrayPool方式创建数组耗时:17545  Gc总分配量4130800
默认方式创建数组耗时:26870  Gc总分配量37354100896

2.3示例(前端文件通过后端Api上传OSS)


private static void PostFileByBytesPool(FORMFile file)
{
    HttpClient client = new HttpClient() { BaseAddress = new Uri("https://fileserver.com") };

    var fileLen = (int)file.Length;
    var fileArr = ArrayPool<byte>.Shared.Rent(fileLen);

    using var stream = file.OpenReadStream();
    stream.Read(fileArr, 0, fileLen);

    MultipartFormDataContent content = new MultipartFormDataContent();
    content.Add(new ByteArrayContent(fileArr, 0, fileLen), "id_" + Guid.NewGuid().ToString(), file.FileName);

    client.PostAsync("/myfile/" + file.FileName, content).Wait();
    ArrayPool<byte>.Shared.Return(fileArr, true);
}

3、Create()

ArrayPool Create()函数会创建一个 ConfigurableArrayPool 对象

ConfigurableArrayPool 构造函数接收两个参数

  • maxArrayLength :单次租借的数组最大长度,不可超过 1024*1024*1024
  • maxArraysPerBucket :最多可以存在的未归还缓冲区数量

通过这两个参数可以解决 Shared 方式的两个问题:

  • 自定义单个数组的最大长度,可以获取更大的内存空间用来存储大文件等
  • 限定了数组的长度和最大缓冲区数量,就限定了最大的不可回收内存数量,防止高并发时缓冲池内存持续增长

示例:


//创建一个自定义缓冲池实例,单个数组最大长度为1024 * 2048,最大可同时租用10个缓冲区
ArrayPool<int> CustomerArrayPool = ArrayPool<int>.Create(1024 * 2048,10);


与Shared不同的是,如果设置 CustomerArrayPool=Null 那么在下一次垃圾回收时该缓冲池所占的内存会立马全部释放。

为防止不可预测的风险,应该保持CustomerArrayPool的存活。

同时为了防止内存的滥用应该限制CustomerArrayPool的数量

到此这篇关于.net性能调优-ArrayPool详情的文章就介绍到这了,更多相关.Net性能调优-ArrayPool内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: .Net性能调优-ArrayPool详情

本文链接: https://www.lsjlt.com/news/135632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .Net性能调优-ArrayPool详情
    目录1、使用2、Shared2.1特点2.2耗时对比2.3示例(前端文件通过后端Api上传OSS)3、Create()1、使用 获取缓冲池实例 :Create / Shar...
    99+
    2022-11-12
  • Android性能优化方案详情
    目录1、指标 2、包大小优化3、响应时间优化 4、内存优化5、CPU优化6、耗电量优化前言: 上一个季度在百度工作挺忙碌,在最后期限完成了OKR目标,因此有一段时间没有写文章。今天趁...
    99+
    2022-11-12
  • 性能调优之java服务器容器调优详解
    目录1.为什么要进行项目性能调优2.服务容器的性能调优2.1对SpringBoot中切入式的Tomcat调优:优化最大线程数调优说明:调优设置2.2网络IO模型调优调优设置2.3容器...
    99+
    2023-05-16
    Java性能调优 Java服务器 Java服务器容器调优
  • Android性能优化全局异常处理详情
    目录前言1 UncaughtExceptionHandler1.1 替代Android异常机制1.2 可选择的异常处理2 日志上传2.1 日志收集2.2 日志存储3 策略设计模式实现...
    99+
    2022-11-13
  • SparkSQL关于性能调优选项详解
    目录Spark_SQL性能调优性能调优选项几种压缩选项的特点可选的调优选项代码示例Spark_SQL性能调优 众所周知,正确的参数配置对提升Spark的使用效率具有极大助力,帮助相关...
    99+
    2023-02-01
    Spark SQL性能调优 Spark性能调优
  • MySQL性能调优
    对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库……林林总总,但是第一必备技能还应该是MySQL。从LAMP的兴起,到Mariadb的...
    99+
    2022-05-13
    mysql
  • redis性能调优
    针对Redis的性能优化,主要从下面几个层面入手:最初的也是最重要的,确保没有让Redis执行耗时长的命令使用pipelining将连续执行的命令组合执行,使用pipelining时,只需要从客户端一次向R...
    99+
    2022-10-18
  • Java多线程异步调用性能调优方法详解
    目录概述同步调用和异步调用Future类图Future的不足代码代码地址TestPaymentServiceCheckServiceOrderService总结概述 大型电商公司的支...
    99+
    2022-11-13
  • oracle 10g性能调优
    原文http://www.oracle.com/technetwork/articles/schumacher-analysis-099313.html 数据库Oracle 10 g,许多以前难以得到的响应...
    99+
    2022-10-18
  • 05-Nginx性能调优
    目录 Nginx 的并发处理机制 全局模块下的调优 worker_processes 2 worker_cpu_affinity 01 10 worker_rlimit_nofile 65535 events 模块下的调优 w...
    99+
    2023-09-17
    nginx 服务器 运维
  • WebLogic Server 性能调优
    任何在市场上成功的产品都拥有良好的性能。虽然成为象WebLogic Server这样广泛使用的产品需要具备很多特性,但性能绝对是必不可少的。 良好的编程习惯在帮助应用运行方面起了很大的作用,但是仅有它们还是不够的。应用服务器必须能够在多种硬...
    99+
    2023-06-03
  • MySQL性能分析、及调优工具使用详解
    本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅。先介绍下基础设施(CPU、IO、网络等)检查的工具:vmstat、sar(sysstat工具包)、mpstat、oprofil...
    99+
    2022-10-18
  • 关于redis状态监控和性能调优详解
    前言 对于任何应用服务和组件,都需要一套完善可靠谱监控方案。 尤其redis这类敏感的纯内存、高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提。 本文主要给大家介绍了关于redis状态监控和...
    99+
    2022-06-04
    详解 状态 性能
  • .NET使用Collections.Pooled提升性能优化的方法
    目录简介Collections.Pooled如何使用性能对比PooledList<T>PooledDictionary<TKey, TValue>Pooled...
    99+
    2022-11-13
  • oracle性能调优学习0621
    1.PLAN_tablecolumn query_plan format a55column cardinality format 99999column cost format 99999delet...
    99+
    2022-10-18
  • oracle性能调优学习0622
    查询数据库中的等待事件:SET lines 100SET pages 10000COLUMN wait_class format a12COLUMN event format a30COLUMN total...
    99+
    2022-10-18
  • sqlserver性能调优的方式
    本篇内容主要讲解“sqlserver性能调优的方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlserver性能调优的方式”吧!首先搞清楚,性能调优的目标...
    99+
    2022-10-18
  • 如何调优jQuery的性能
    这篇文章将为大家详细讲解有关如何调优jQuery的性能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。创建性能测试关于性能测试的第一步是创建一个合适的性能测试...
    99+
    2022-10-19
  • mysql的数据压缩性能对比详情
    目录1. 测试环境1.1 软硬件1.2 表结构2. 测试目的2.1 压缩空间对比2.2 查询性能对比3. 测试工具3.1 mysqlslap3.2 测试query4.测试结论数据魔方...
    99+
    2022-11-12
  • Java高性能序列化工具Kryo详情
    目录概述基础用法Kryo 的序列化Kryo 的注册Kryo 的序列化器对象引用线程不安全ThreadLocal + Kryo 解决线程不安全对象池 + Kryo 解决线程不安全小结概...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作