最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net性能調(diào)優(yōu)-ArrayPool詳情

 更新時間:2021年09月14日 11:02:04   作者:張三~~  
ArrayPool具有高性能 托管 數(shù)組緩沖池,可重復使用,用 租用 空間的方式代替 重新分配 數(shù)組空間的行為的特點及可以在頻繁創(chuàng)建和銷毀數(shù)組的情況下 提高性能 ,減少垃圾回收器的壓力的優(yōu)點,下面文章內(nèi)容將詳細對其做介紹,需要的朋友可以參考一下

1、使用

  • 獲取緩沖池實例 :Create / Shared var pool=ArrayPool[byte].Shared
  • 調(diào)用緩沖池實例 :Rent() 函數(shù),租用緩沖區(qū)空間 byte[] array=pool.Rent(1024)
  • 調(diào)用緩沖池實例 :Return(array[T]) 函數(shù),歸還租用的空間 pool.Return(array)

2、Shared

Shared返回為一個靜態(tài)共享實例,實際返回了一個 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特點

租用數(shù)組長度不可超過 2^20( 1024*1024 = 1 048 576),否則會從GC中重新開辟內(nèi)存空間
Rent 租用數(shù)組實際返回的長度可能比請求的長度大,返回長度一是(16*2^n)
Return
歸還緩沖區(qū)的時候,如果不設(shè)置 clearArray ,下一個租用者可能會看到之前的填充的值(在返回的數(shù)組長度剛好是下一個租用者請求的長度時會被看到)
緩沖池的內(nèi)存釋放不是實時釋放,在緩沖區(qū)空閑時,大概10到20秒之后,會隨著第2代GC一起釋放,分批釋放
并發(fā)數(shù)量持續(xù)增長時,緩沖池占用的內(nèi)存空間也會持續(xù)增長,而且似乎沒有上限

2.2耗時對比

private static void TimeMonitor()
{
    //隨機生成3000個數(shù)組的長度值
    var sizes = new int[30000];
    Parallel.For(0, 10000, x => { sizes[x] = new Random().Next(1024 * 800, 1024 * 1024); });

    //緩沖池方式租用數(shù)組
    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 方式分配數(shù)組空間
    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方式創(chuàng)建數(shù)組耗時:" + time1 + "  Gc總分配量" + (gcAllocate1 - gcAllocate0));
    Console.WriteLine("默認方式創(chuàng)建數(shù)組耗時:" + time2 + "  Gc總分配量" + (gcAllocate2 - gcAllocate1 - gcAllocate0));
}

內(nèi)存使用截圖:左側(cè)沒有波動的橫線是緩沖池執(zhí)行的過程,右側(cè)為手動創(chuàng)建數(shù)組的執(zhí)行過程

執(zhí)行結(jié)果:

ArrayPool方式創(chuàng)建數(shù)組耗時:17545  Gc總分配量4130800
默認方式創(chuàng)建數(shù)組耗時: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()函數(shù)會創(chuàng)建一個 ConfigurableArrayPool 對象

ConfigurableArrayPool 構(gòu)造函數(shù)接收兩個參數(shù)

  • maxArrayLength :單次租借的數(shù)組最大長度,不可超過 1024*1024*1024
  • maxArraysPerBucket :最多可以存在的未歸還緩沖區(qū)數(shù)量

通過這兩個參數(shù)可以解決 Shared 方式的兩個問題:

  • 自定義單個數(shù)組的最大長度,可以獲取更大的內(nèi)存空間用來存儲大文件等
  • 限定了數(shù)組的長度和最大緩沖區(qū)數(shù)量,就限定了最大的不可回收內(nèi)存數(shù)量,防止高并發(fā)時緩沖池內(nèi)存持續(xù)增長

示例:

//創(chuàng)建一個自定義緩沖池實例,單個數(shù)組最大長度為1024 * 2048,最大可同時租用10個緩沖區(qū)
ArrayPool<int> CustomerArrayPool = ArrayPool<int>.Create(1024 * 2048,10);


與Shared不同的是,如果設(shè)置 CustomerArrayPool=Null 那么在下一次垃圾回收時該緩沖池所占的內(nèi)存會立馬全部釋放。

為防止不可預測的風險,應(yīng)該保持CustomerArrayPool的存活。

同時為了防止內(nèi)存的濫用應(yīng)該限制CustomerArrayPool的數(shù)量

到此這篇關(guān)于.Net性能調(diào)優(yōu)-ArrayPool詳情的文章就介紹到這了,更多相關(guān).Net性能調(diào)優(yōu)-ArrayPool內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .Net執(zhí)行SQL存儲過程之易用輕量工具詳解

    .Net執(zhí)行SQL存儲過程之易用輕量工具詳解

    這篇文章主要為大家介紹了.Net執(zhí)行SQL存儲過程之易用輕量工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • ASP.NET Core  依賴注入框架的使用

    ASP.NET Core 依賴注入框架的使用

    還記得上篇文章中最后提及到,假如服務(wù)越來越多怎么處理呢,本篇文章將會帶來解決辦法, ASP.NET Core 依賴注入框架的相關(guān)資料,需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-10-10
  • ASP.NET Core MVC 依賴注入View與Controller

    ASP.NET Core MVC 依賴注入View與Controller

    本文重點給大家介紹的是ASP.NET Core MVC 之依賴注入 View 和ASP.NET Core MVC 之依賴注入 Controller的相關(guān)資料,需要的小伙伴可以參考下面文章具體內(nèi)容
    2021-09-09
  • ASP.NET MVC Web API HttpClient簡介

    ASP.NET MVC Web API HttpClient簡介

    依稀還記得那個時候用WebClient,HttpWebRequest來發(fā)送一個請求,現(xiàn)在ASP.NET MVC4中自帶了一個類HttpClient;需要的朋友可以參考下
    2012-11-11
  • .NET項目在k8s中運行的Dapr持續(xù)集成流程

    .NET項目在k8s中運行的Dapr持續(xù)集成流程

    這篇文章主要介紹了.NET項目在k8s中運行的Dapr持續(xù)集成流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • 一文透徹詳解.NET框架類型系統(tǒng)設(shè)計要點

    一文透徹詳解.NET框架類型系統(tǒng)設(shè)計要點

    這篇文章主要為大家透徹詳解了選擇.NET框架的n個理由,本系列的第一篇文章全面概述了平臺的支柱和設(shè)計要點,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • ASP.NET Core 依賴注入詳細

    ASP.NET Core 依賴注入詳細

    這篇文章主要介紹ASP.NET Core 依賴注入,ASP.NET Core 應(yīng)用在啟動過程中會依賴各種組件提供服務(wù),這些組件會以接口的形式標準化,這些組件就是我們所說的服務(wù),ASP.NET Core框架建立在一個底層的依賴注入框架之上,它使用容器提供所需的服務(wù),下面我們就來詳細了解一下
    2021-10-10
  • .NET6新特性之 隱式命名空間引用

    .NET6新特性之 隱式命名空間引用

    本文給大家分享的是 .NET6特新 隱式命名空間引用,如果我們要在新加一個命名空間的引用,可以在項目文件中配置增加<Using Include="命名空間"/>,如果需要移除一個命名空間可以這么做<Using Remove="命名空間"/>,下面來看看文章詳細介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11
  • .NET 6 即將到來的新特性  隱式命名空間引用

    .NET 6 即將到來的新特性 隱式命名空間引用

    ASP.NET 現(xiàn)在我們還是需要手動加命名空間引用,在以后的版本中可能就不需要手動加命名空間的引用了,本文就來介紹.NET 6即將到來的新特性--隱式命名空間引用,,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    學習是使用asp.net已經(jīng)有很長一段時間了,現(xiàn)在就來分析一下mvc的整過過程吧。個人計劃寫一個mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時我們一定會經(jīng)歷路由,那么路由這東東是怎么搞出來的啊
    2012-11-11

最新評論

新宁县| 彭山县| 淮南市| 大关县| 灵台县| 竹山县| 公安县| 玛曲县| 大荔县| 界首市| 尚志市| 建平县| 青川县| 彭山县| 南充市| 资中县| 平山县| 新竹市| 佳木斯市| 滦南县| 聂荣县| 湖州市| 张家口市| 米易县| 都匀市| 临桂县| 浦县| 隆昌县| 任丘市| 海宁市| 天峻县| 太康县| 锡林郭勒盟| 双城市| 大厂| 东乡族自治县| 枣庄市| 沙河市| 岑巩县| 扬中市| 长治县|