色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

.NET8性能優化之線程

OSC開源社區 ? 來源:江湖評談 ? 2024-01-22 14:50 ? 次閱讀

前言

首先來看下,為什么性能會一直持續性優化。.NET8引入的SSE-XMM(16字節)Register和AVX-YMM(32字節)Register是關鍵,傳統的Register一般指令集層次能移動的最多只有8位,就算是最新的x64系統。但是SSE和AVX改變了這種局面,它們能一次性移動64位系統的一倍乃至四倍,這就是優化的關鍵。

之前的多篇文章展示了很多.NET8的性能優化,基本上都是核心級的CLR/JIT優化,包括了VM,Zeroing,CHRL,Exception,Non_GC,Branch,GC,Reflection,AOT,Enum,DateTime等等。但是漏掉了一個較為重要的東西:線程。本篇來看下.NET8里面的線程優化。

ThreadStatic

.NET在新的版本中,對線程,并發,并行,異步等方面做出了非常大的改進。比如ThreadPool完全重寫,異步方法基礎部分的完全重寫,ConcurrentQueue隊列的完全重寫等等。.NET8在這些的基礎上,進行了更為深思熟慮的和更為有影響力的改進。比如ThreadStatic。

.NET運行時里面運用本地數據和線程的關聯,就是本地線程存儲(TLS)。在托管代碼上實現這一點,最常用的方法就是用[ThreadStatic]屬性注解一個靜態字段(當然這里還有個用途更高級的ThreadLocal),這樣就會導致.NET運行時會把這個靜態字段的存儲復制到每個線程,而不是全局的進程上面。

例如以下ThreadStaitc屬性注解的用法

private static int s_onePerProcess;


[ThreadStatic]
private static int t_onePerThread;

在.NET8之前訪問被TheadStatic標記的字段,需要一個JIT的非內聯輔助方法CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR。它的原型實際上就是JIT_GetSharedNonGCThreadStaticBase。如下:

#include 
HCIMPL2(void*, JIT_GetSharedNonGCThreadStaticBase, DomainLocalModule *pDomainLocalModule, DWORD dwClassDomainID)
{
//為了便于觀看,此處省略
    return HCCALL1(JIT_GetNonGCThreadStaticBase_Helper, pMT);
}
HCIMPLEND

因為這個方法本身是有優化空間的,經過dotnet/runtime#82973 and dotnet/runtime#85619它的函數本體被內聯到了調用者當中了。省略了函數調用以及跳轉的成本。通過一個基準測試來看下這個效果。

// dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0
//dotnetrun-cRelease-fnet7.0--filter"*"--runtimesnativeaot7.0nativeaot8.0
using BenchmarkDotNet.Attributes;
usingBenchmarkDotNet.Running;
BenchmarkSwitcher.FromAssembly(typeof(Tests).Assembly).Run(args);
[HideColumns("Error", "StdDev", "Median", "RatioSD")]
public partial class Tests
{
    [ThreadStatic]
    private static int t_value;


    [Benchmark]
    public int Increment() => ++t_value;
}

測試結果如下,提升明顯:

方法 運行時 平均值 比率
Increment .NET 7.0 8.492 ns 1.00
Increment .NET 8.0 1.453 ns 0.17

同樣的通過

dotnet/runtime#84566 和 dotnet/runtime#87148為.NET AOT做的一個優化,提升同樣明顯。

方法 運行時 平均值 比率
Increment NativeAOT 7.0 2.305 ns 1.00
Increment NativeAOT 8.0 1.325 ns 0.57

ThreadPool

TheadPool優化在于線程池方面,之前老版本的.NET基本上都是通過封裝Windows線程池,然后通過托管代碼調用。但是在.NET6里面開始.NET運行時實現了自己的托管線程池,也就是說新版的.NET包含了兩個線程池。分別為托管調用的windows線程池,以及托管代碼自己實現的托管線程池。現在,在.NET8里面可以自由切換這兩個線程池,你想使用哪個就用哪個,以提升程序的性能。

我們來看下,這個過程。首先新建一個.NET8.0控制臺應用程序,代碼如下

static void Main(string[] args)
{
    Task.Run(() => Console.WriteLine(Environment.StackTrace)).Wait();
Console.ReadLine();
}

并在 .csproj 中添加true。先運行下它,結果顯示如下:

at System.Environment.get_StackTrace()
at ThreadPool_.Program.<>c.
b__0_0() in E:Visual Studio ProjectTest_ThreadPool_Program.cs:line 7 at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) at System.Threading.ThreadPoolWorkQueue.Dispatch() at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()

PortableThreadPool這個就是.NET6以來新增的托管線程池操控的代碼。我們下面再來看下Windows線程池方面,把上面代碼進行AOT編譯

dotnet publish -c Release -r win-x64

我們運行下路徑inRelease et8.0win-x64publish里的exe文件,可以看到如下:

at System.Environment.get_StackTrace() + 0x21
at ThreadPool_.Program.<>c.
b__0_0() + 0x9 at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread, ExecutionContext, ContextCallback, Object) + 0x3d at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task&, Thread) + 0xcc at System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x289 at System.Threading.WindowsThreadPool.DispatchCallback(IntPtr, IntPtr, IntPtr) + 0x45

很明顯的看到這里是WindowsThreadPool(Windows線程池調用),而上面的則是PortableThreadPool(.NET運行時自己實現的托管線程池)。這里有個疑問,為什么AOT可以看到Windows線程池,因為AOT是本地預編譯機器碼,它不包含托管代碼,所以只能Windows自帶線程池調用。但是如果是托管代碼,不是AOT化,那么可以看到原汁原味的托管線程池調用。

通過issuse:dotnet/runtime#85373,Windows上運行的.NET8應用程序可以選擇任何一個線程池。

可以在 .csproj 中的中,添加 :

false

false表示不使用Windows線程池,True表示使用。其它的,也可以設置環境變量,來使用Windows線程池,設置0則不使用。

DOTNET_ThreadPool_UseWindowsThreadPool=1

目前來說,沒有確切的證據證明哪個線程池好用,或者效率更高。但是開發者可以使用上面的選項來進行自己的選擇,有一個測試就是在Windows線程池在比較大的機器上的IO擴展性不太好。如果你的應用程序已經大量的使用了Windows線程池,那么可以通過以上設置為另一個線程池操作也是可以的。此外,線程池經常被阻塞,Windows線程池對此有更多的處理,也能更有效的比托管線程處理的更好。如以下代碼:

// dotnet run -c Release -f net8.0


usingSystem.Diagnostics;
varsw=Stopwatch.StartNew();
var barrier = new Barrier(Environment.ProcessorCount * 2 + 1);
for (int i = 0; i < barrier.ParticipantCount; i++)
{
    ThreadPool.QueueUserWorkItem(id =>
    {
        Console.WriteLine($"{sw.Elapsed}: {id}");
        barrier.SignalAndWait();
    }, i);
}


barrier.SignalAndWait();
Console.WriteLine($"Done:{sw.Elapsed}");

以上創建了很多工作項,所有的工作項都會被阻塞,直到所有工作項都被處理完畢。這里可以設置DOTNET_ThreadPool_UseWindowsThreadPool 為 1。看下對比的結果,顯示Windows線程池處理的更好。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • 指令集
    +關注

    關注

    0

    文章

    222

    瀏覽量

    23378
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19675

原文標題:.NET8極致性能優化-線程

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    css的性能優化重點

    網站前端性能優化javascript和css
    發表于 10-21 09:12

    MySQL優化查詢性能優化查詢優化器的局限性與提示

    MySQL優化三:查詢性能優化查詢優化器的局限性與提示
    發表于 06-02 06:34

    線程管理線程切換

    線程管理線程切換前言基本信息前言說明PendSV_Handler函數前言基本信息名稱描述說明RT-Thread Studio 軟件版本版本: 1.1.3RT-Thread 系統版本
    發表于 08-24 08:19

    《現代CPU性能分析與優化》---精簡的優化

    來提高程序的性能。由于這本書是Denis在easyperf.net博客分享內容的系統整理和總結。更加偏向實戰類型,在閱讀過程中,可以直接對自己的C/C++代碼進行剖析和優化實驗。當然這本書也是有缺點
    發表于 04-18 16:03

    Oracle數據庫網絡安全訪問機制

    本文主要分析了Oracle 客戶端通過Net8 訪問數據庫服務器過程,闡述了Oracle 數據庫的網絡訪問機制以及Net8 在實現Oracle 數據庫的服務器和客戶端之間安全的數據通信中的重要作用。
    發表于 08-29 10:20 ?20次下載

    利用緩存技術優化基于ASP.NET的Web GIS性能

    隨著Web GIS的快速發展和廣泛應用,對Web GIS的性能提出了更高的要求。ASP.NET是微軟推出的新一代動態網頁技術,它提供了強大的Web應用開發功能,依托ActiveX技術,開發基于ASP.NET的Web
    發表于 09-23 10:54 ?17次下載

    基于_NET線程間通訊技術的應用_張雪飛

    基于_NET線程間通訊技術的應用_張雪飛
    發表于 03-19 11:31 ?0次下載

    C#多線程技術

    C#和.NET類庫為開發多線程應用程序提供了很方便的支持,本章首先簡要介紹.NET類庫中的Thread類及各種線程支持,再通過示例說明線程使
    發表于 04-23 11:32 ?15次下載

    LibTorch-based推理引擎優化內存使用和線程

    LibTorch-based推理引擎優化內存使用和線程
    的頭像 發表于 08-31 14:27 ?1231次閱讀
    LibTorch-based推理引擎<b class='flag-5'>優化</b>內存使用和<b class='flag-5'>線程</b>池

    .NET 8發布首個RC,比.NET 7的超級快更快!

    此外,RC1 在 .NET MAUI 方面帶來了諸多質量改進,修復內存泄露和諸多特定平臺的問題,改進了 UI 控制并優化性能,在 Mac 上支持蘋果 Xcode 15。
    的頭像 發表于 09-18 16:54 ?1376次閱讀
    .<b class='flag-5'>NET</b> <b class='flag-5'>8</b>發布首個RC,比.<b class='flag-5'>NET</b> 7的超級快更快!

    .NET8為原生AOT改進 Linux上原生AOT應用程序大小最多減少50%

    ,它不需要運行時,所有內容都包含在一個文件中。 微軟介紹道,.NET 8 為原生 AOT 發布帶來了以下改進: 增加對 x64 和 macOS Arm64 架構的支持 將 Linux 上原生 AOT
    的頭像 發表于 11-14 11:53 ?1435次閱讀
    .<b class='flag-5'>NET8</b>為原生AOT改進 Linux上原生AOT應用程序大小最多減少50%

    .NET8為什么要引入Non-GC Heap這種機制呢?

    .NET8里面JIT引入了一個新的機制,叫做Non-GC Heap。JIT可以確保相關對象分配在Non-GC Heap上,該堆像其名稱一樣,不受GC管理。
    的頭像 發表于 11-28 10:38 ?660次閱讀

    .NET8極致性能優化AOT

    .NET8對于性能優化是方方面面的,所以AOT預編譯機器碼也是不例外的。本篇來看下對于AOT的優化
    的頭像 發表于 12-06 10:16 ?935次閱讀

    OPCUA產品情報:.NET SDK最新版本公布,系列產品穩步更新中!

    近期,Unified Automation公司推出了.NET based OPC UA SDK v4.0.0這一產品。該版本除了例行的Bug修復外,還進行了部分函數API的修改與功能的擴展,新添了對使用MQTT/JSON傳輸的PubSub模塊和.NET8的支持。
    的頭像 發表于 03-14 10:00 ?897次閱讀
    OPCUA產品情報:.<b class='flag-5'>NET</b> SDK最新版本公布,系列產品穩步更新中!

    Linux性能優化

    一、優化內核相關參數 配置文件/etc/sysctl.conf 配置方法直接將參數添加進文件每條一行 sysctl -a 可以查看默認配置sysctl -p 執行并檢測是否有錯誤 1、網絡相關
    的頭像 發表于 12-06 10:15 ?191次閱讀
    Linux<b class='flag-5'>之</b><b class='flag-5'>性能</b><b class='flag-5'>優化</b>
    主站蜘蛛池模板: 3d无遮挡h肉动漫在线播放| 国产福利一区二区精品| 国产呦精品一区二区三区网站| 考好老师让你做一次H| 午夜在线观看免费完整直播网页| 最近中文字幕在线中文高清版| 国产成人自拍视频在线观看| 毛片大全网站| 亚洲黄色在线视频| 父亲猜女儿在线观看| 免费在线视频a| 亚洲在线成色综合网站| 国产超碰人人爱被IOS解锁| 年轻夫妇韩剧中文版免费观看| 亚洲一区国产| 国产精品美女久久久久AV超清 | 2020亚洲国产在线播放在线| 国产真实乱对白精彩| 四虎永久免费网址| WWW国产亚洲精品久久久日本| 久久精品视在线观看2| 喜马拉雅听书免费版| 俄罗斯9一14 young处| 欧美人妇无码精品久久| 中国二级毛片| 久久99国产视频| 亚洲精品动漫免费二区| 国产精品麻豆a在线播放| 色婷婷激婷婷深爱五月小蛇| a在线观看视频| 麻豆一二三区果冻| 在线 国产 欧美 专区| 黄色大片久久| 亚洲精品无码葡京AV天堂| 国产乱码伦人偷精品视频| 双性h浪荡受bl| 国产99r视频精品免费观看| 日本精品久久久久中文字幕2| a色毛片免费视频| 欧美群交XXXCOM| 超碰 无码 中文字幕|