亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

.Net Core中使用ref和Span 提高程序性能的實現代碼

2024-07-10 13:32:22
字體:
來源:轉載
供稿:網友

一、前言

其實說到ref,很多同學對它已經有所了解,ref是C# 7.0的一個語言特性,它為開發人員提供了返回本地變量引用和值引用的機制。
Span也是建立在ref語法基礎上的一個復雜的數據類型,在文章的后半部分,我會有一個例子說明如何使用它。

二、ref關鍵字

不論是ref還是out關鍵,都是一種比較難以理解和操作的語言特性,如C語言中操作指針一樣,這樣的高級語法總是什么帶來一些副作用,但是我不認為這有什么,而且不是每一個C#開發者都要對這些內部運行的機制有著深刻的理解,我覺得不論什么復雜的東西只是為人們提供了一個自由的選擇,風險和靈活性永遠是不能兼容的。

來看幾個例子來說明引用與指針的相同性,當然下面的使用方式早在C# 7.0之前就可以使用了:

public static void IncrementByRef(ref int x){ x++;}public unsafe static void IncrementByPointer(int* x){ (*x)++;}

上面兩個函數分別是使用ref和非安全指針來完成參數+1。

int i = 30;IncrementByRef(ref i);// i = 31unsafe{ IncrementByPointer(&i);}// i = 32

下面是C# 7.0提供的特性:

1.ref locals (引用本地變量)

int i = 42;ref var x = ref i;x = x + 1;// i = 43

這個例子中為本地 i 變量的引用 x, 當改變x的值時i變量的值也改變了。

2.ref returns (返回值引用)

ref returns是C# 7中一個強大的特性,下面代碼是最能體現其特性的,該函數提供了,返回int數組中某一項的引用:

public static ref int GetArrayRef(int[] items, int index) => ref items[index];

通過下標取得數組中的項目的引用,改變引用值時,數組也會隨之改變。

三、Span

System.Span是.Net Core核心的一部分,在System.Memory.dll 程序集下。目前該特性是獨立的,將來可能會集成到CoreFx中;

如何使用呢?在.Net Core 2.0 SDK創建的項目下引用如下NuGet包:

 <ItemGroup> <PackageReference Include="System.Memory" Version="4.4.0-preview1-25305-02" /> <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.4.0-preview1-25305-02" /> </ItemGroup>

在上面我們看到了使用ref關鍵字可以提供的類似指針(T*)的操作單一值對象方式?;旧显?NET體系下操作指針都不認為是一件好的事件,當然.NET為我們提供了安全操作單值引用的ref。但是單值只是用戶使用“指針”的一小部分需求;對于指針來說,更常見的情況是操作一系列連續的內存空間中的“元素”時。

Span表示為一個已知長度和類型的連續內存塊。許多方面講它非常類似T[]或ArraySegment,它提供安全的訪問內存區域指針的能力。其實我理解它更將是.NET中操作(void*)指針的抽象,熟悉C/C++開發者應該更明白這意味著什么。

Span的特點如下:

•抽象了所有連續內存空間的類型系統,包括:數組、非托管指針、堆棧指針、fixed或pinned過的托管數據,以及值內部區域的引用
•支持CLR標準對象類型和值類型
•支持泛型
•支持GC,而不像指針需要自己來管理釋放

下面來看下Span的定義,它與ref有著語法和語義上的聯系:

public struct Span<T> { ref T _reference; int _length; public ref T this[int index] { get {...} } ...}public struct ReadOnlySpan<T> { ref T _reference; int _length; public T this[int index] { get {...} } ...}

接下來我會用一個直觀的例子來說明Span的使用場景;我們以字符截取和字符轉換(轉換為整型)為例:

如有一個字符串string content = "content-length:123",要轉換將123轉換為整型,通常的做法是先Substring將與數字字符無關的字符串進行截斷,轉換代碼如下:

string content = "content-length:123";Stopwatch watch1 = new Stopwatch();watch1.Start();for (int j = 0; j < 100000; j++){ int.Parse(content.Substring(15));}watch1.Stop();Console.WriteLine("/tTime Elapsed:/t" + watch1.ElapsedMilliseconds.ToString("N0") + "ms");

為什么使用這個例子呢,這是一個典型的substring的使用場景,每次操作string都會生成新的string對象,當然不光是Substring,在進行int.Parse時重復操作string對象,如果大量操作就會給GC造成壓力。

使用Span實現這個算法:

string content = "content-length:123";ReadOnlySpan<char> span = content.ToCharArray(); span.Slice(15).ParseToInt();watch.Start();for (int j = 0; j < 100000; j++){ int icb = span.Slice(15).ParseToInt();}watch.Stop();Console.WriteLine("/tTime Elapsed:/t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");

這里將string轉換為int的算法利用ReadonlySpan實現,這也是Span的典型使用場景,官方給的場景也是如些,Span適用于多次復用操作連續內存的場景。

轉換代碼如下:

public static class ReadonlySpanxtension{ public static int ParseToInt(this ReadOnlySpan<char> rspan) {  Int16 sign = 1;  int num = 0;  UInt16 index = 0;  if (rspan[0].Equals('-')){   sign = -1; index = 1;  }  for (int idx = index; idx < rspan.Length; idx++){   char c = rspan[idx];   num = (c - '0') + num * 10;  }  return num * sign; }}

四、最后

上述兩段代碼100000次調用的時間如下:

String Substring Convert:  Time Elapsed: 18msReadOnlySpan Convert:  Time Elapsed: 4ms

目前Span的相關支持還夠,它只是最基礎架構,之后CoreFx會對很多API使用Span進行重構和實現。可見.Net Core的性能日后會越來越強大。

以上所述是小編給大家介紹的.Net Core中使用ref和Span<T>提高程序性能的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利微拍一区二区| 日韩免费黄色av| 亚洲国产精品电影| 最新国产精品亚洲| 欧美黄色小视频| 欧美色videos| 国产99久久久欧美黑人| 久久激情五月丁香伊人| 97激碰免费视频| 色偷偷av一区二区三区乱| 日本一欧美一欧美一亚洲视频| 亚洲成人网av| 在线播放国产精品| 九九久久久久久久久激情| 国产xxx69麻豆国语对白| 国产成人精品电影久久久| 国产精品美女主播在线观看纯欲| 亚洲色图欧美制服丝袜另类第一页| 亚洲第一视频在线观看| 38少妇精品导航| 国产91热爆ts人妖在线| 伊人一区二区三区久久精品| 久久久欧美一区二区| 国产视频久久久久| 国产日韩欧美黄色| 久久精品中文字幕免费mv| 欧美视频专区一二在线观看| 亚洲视频在线观看网站| 欧洲亚洲妇女av| 欧美视频在线免费| 91精品久久久久久综合乱菊| 久久精品国产免费观看| 欧美丝袜美女中出在线| 久久久久久国产精品三级玉女聊斋| 中文字幕欧美日韩| 欧美一区第一页| 精品国产依人香蕉在线精品| 成人网页在线免费观看| 久久久精品久久久| 亚洲天堂av在线播放| 狠狠躁夜夜躁人人躁婷婷91| 亚洲美女黄色片| 性色av一区二区三区在线观看| 国产精品视频26uuu| 国产+人+亚洲| 日韩精品极品视频| 欧美福利视频在线| 亚洲精品一区二区网址| 国产精品老牛影院在线观看| 97久久精品人人澡人人爽缅北| 国产国产精品人在线视| 欧美午夜视频一区二区| 欧美日韩成人免费| 国产日韩换脸av一区在线观看| 91国语精品自产拍在线观看性色| 国产精品入口免费视频一| 日韩av片永久免费网站| 久久久精品一区| 97免费中文视频在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久精品99久久久久久久久| www亚洲欧美| 青青久久aⅴ北条麻妃| 韩国美女主播一区| 日韩欧美精品免费在线| 97成人超碰免| 日韩成人高清在线| 亚洲一区二区中文字幕| 疯狂做受xxxx高潮欧美日本| 欧美大胆在线视频| 中文字幕日韩高清| 国产精品久久久久一区二区| 欧美专区日韩视频| 色在人av网站天堂精品| 国产国产精品人在线视| 一本色道久久88综合日韩精品| 亚洲欧美国产另类| 黑人巨大精品欧美一区二区一视频| 国产精品视频免费在线| 国产精品成人av在线| 国产一区二区激情| 欧美三级欧美成人高清www| 国产成人精品优优av| 日韩av最新在线观看| 欧美精品久久久久久久久| 亚洲精品福利免费在线观看| 久久精品男人天堂| 亚洲综合精品伊人久久| 精品久久久国产精品999| 黄色成人av网| 日韩**中文字幕毛片| 国产一区二区三区18| 久久精视频免费在线久久完整在线看| 亚洲字幕一区二区| 亚洲护士老师的毛茸茸最新章节| 国产精品视频1区| 国产香蕉一区二区三区在线视频| 亚洲欧美999| 久久99亚洲精品| 欧美一区二区大胆人体摄影专业网站| 欧美激情第99页| 91成人福利在线| 欧美乱大交xxxxx另类电影| 国语自产精品视频在线看| 国产在线观看91精品一区| 国产精品主播视频| 日韩欧美在线播放| 国精产品一区一区三区有限在线| 亚洲性69xxxbbb| 欧美日韩一区二区在线播放| 88国产精品欧美一区二区三区| 日韩精品在线观看视频| 亚洲人成电影网| 亚洲影院色在线观看免费| 午夜免费日韩视频| 国产精品久久久久国产a级| 日韩成人久久久| 日韩久久免费视频| 久久精品国产久精国产思思| 亚洲九九九在线观看| 亚洲色图综合久久| 成人黄色免费网站在线观看| 91在线高清免费观看| 亚洲精品之草原avav久久| 成人精品久久av网站| 中文字幕欧美日韩va免费视频| 国产精品久久久av久久久| 国产日韩精品入口| 91精品国产自产在线观看永久| 国产成人免费av| 日韩精品免费一线在线观看| 成人av在线网址| 亚洲欧洲日产国码av系列天堂| 黑人巨大精品欧美一区免费视频| 国产精品自产拍在线观| 69视频在线播放| 中文欧美日本在线资源| 欧美性在线观看| 国产精品亚洲аv天堂网| 国产精品狼人色视频一区| 91情侣偷在线精品国产| 欧美亚州一区二区三区| 成人久久久久久久| 欧美激情一区二区三区久久久| 亚洲国产高清高潮精品美女| 欧美激情综合色综合啪啪五月| 久久免费在线观看| 久久资源免费视频| 日韩精品在线看| 国内精品国产三级国产在线专| 亚洲电影免费观看高清完整版在线| 91在线视频一区| 亚洲精品第一国产综合精品| 91精品久久久久久久久久| 欧美极品xxxx| 欧美日韩国产精品| 国产日韩欧美另类| 国产成人精彩在线视频九色| 欧美精品18videos性欧| 久久男人的天堂| 96sao精品视频在线观看| 日韩精品中文字| 一区二区欧美亚洲| 亚洲精品国精品久久99热|