2023-09-01 10:18:48來(lái)源:一線碼農(nóng)聊技術(shù)
把 Span 歸于語(yǔ)法糖,可能有些偏了,但偏了就偏了,哈哈,只要是分享就好,C# 發(fā)展至今,已經(jīng)是一門非常重的語(yǔ)言了,所有想要的它都要,即可以:
面向過(guò)程編程面向?qū)ο缶幊堂嫦蚝瘮?shù)式編程面向異步編程面向泛型編程既能做到高開發(fā)效率,又能做到高性能編程。
這里的Span就歸結(jié)于高性能編程這個(gè)范疇了。
(資料圖片僅供參考)
當(dāng)年的 C# 一個(gè)亮點(diǎn)就是屏蔽了指針,自動(dòng)內(nèi)存托管,可以讓程序員更加專注于業(yè)務(wù),現(xiàn)如今策略變了,C# 要變得更加高性能,既然要做高性能那必然少不了指針,而指針又是面向托管層編程的程序員最怕的東西,所以就盡可能的封裝,弄一套屬于自己的托管指針玩法。
Span即屬于托管指針玩法的一個(gè)典型代表,如果你用 ILSpy 去看它的struct結(jié)構(gòu),本質(zhì)上就兩個(gè)成員,一個(gè)叫_pointer,一個(gè)叫_length,參考如下代碼:
public readonly ref struct Span { internal readonly ByReference _pointer; private readonly int _length; }
pointer 是指定起點(diǎn), length 是控制邊界,如果用 C 來(lái)模擬,大概就是這個(gè)樣子。
struct Span { void* ptr; int length;};
畫個(gè)圖大概就是這樣子。
圖片
二:Span 的場(chǎng)景在哪里有了指針,就可以對(duì)內(nèi)存進(jìn)行原地操作,只要能原地操作,那就可以破掉語(yǔ)言層面上的諸多限制,實(shí)現(xiàn)接近C/C++級(jí)的高性能,有些朋友可能要問(wèn)了,語(yǔ)言層面有什么限制?比如最典型的string,大家都知道string是一個(gè)writeoncopy特性的字符串,只要你動(dòng)它一下,它就會(huì)繁殖,接下來(lái)我們就拿string舉個(gè)例子。
1. string 中的數(shù)字求 sum在很久以前你可能會(huì)這么做。
static void Main(string[] args) { var s = "97 3"; var arr = s.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); var sum = Convert.ToInt32(arr[0]) + Convert.ToInt32(arr[1]); Console.WriteLine(sum); }
圖片
從代碼可以看出,對(duì) string 進(jìn)行Split會(huì)導(dǎo)致生成多個(gè)小string對(duì)象,那有沒有辦法不用生成小string呢?這就需要用到托管版的Span做原地處理了。
static void Main(string[] args) { var s = "97 3"; var position = s.IndexOf(" "); ReadOnlySpan span = s.AsSpan(); var num1 = int.Parse(span.Slice(0, position)); var num2 = int.Parse(span.Slice(position)); Console.WriteLine(num1 + num2); }
圖片
Span的這種做法就是通過(guò)_pointer指針在內(nèi)存地址上進(jìn)行移動(dòng)來(lái)完成,如果看不明白,我可以用C來(lái)模擬一下。
#include struct Span { int length; void* ptr;};void sum(Span* span);int main(){ Span span; span.ptr = (char*)"97 3"; span.length = strlen((char*)span.ptr); sum(&span);}void sum(Span* span) { int sum = 0; char* position = strchr((char*)span->ptr, " "); Span span1; span1.ptr = span->ptr; span1.length = (position - span->ptr) / sizeof(char); Span span2; span2.ptr = position; span2.length = span->length - span1.length - 1; int num1= atoi((char*)span1.ptr); int num2= atoi((char*)span2.ptr); sum = num1 + num2; printf("sum=%d", sum);}
圖片
雖然代碼有點(diǎn)多,但邏輯還是很清楚的。
如果大家明白Span所封裝的底層指針玩法,我想這其實(shí)沒什么難的,本篇就說(shuō)到這里吧,希望對(duì)你有幫助。
關(guān)鍵詞:
把Span歸于語(yǔ)法糖,可能有些偏了,但偏了就偏了,哈哈,只要是分享就好
MongoDB是一種可伸縮的數(shù)據(jù)庫(kù),支持?jǐn)?shù)據(jù)分片和負(fù)載均衡,以實(shí)現(xiàn)高性能
世界最強(qiáng)AI——ChatGPT可以通過(guò)各種考試,甚至輸出回答讓人難以辨別真
開學(xué)季|“芝士”就是力量,5分鐘上學(xué)不遲到的早餐,真的漲知識(shí)了
轉(zhuǎn)眼間,九月來(lái)了瓜果漸熟,稻谷飄香,蟹肥菊黃……新的一個(gè)月,繼續(xù)努
中國(guó)天氣網(wǎng)訊中央氣象臺(tái)9月1日06時(shí)繼續(xù)發(fā)布暴雨黃色預(yù)警:預(yù)計(jì),9月1日
大家都知道,華為售后提供存儲(chǔ)空間升級(jí)服務(wù),比如你的手機(jī)是128G存儲(chǔ),
今天來(lái)聊聊關(guān)于progression和progress的區(qū)別,progression的文章,現(xiàn)在
獲取方式:參考如下文章Step13步驟可獲取該物品:地點(diǎn)攻略-湖之利耶尼
1、bepleasedwithsth :對(duì)某事某物喜歡,滿意于…bepleasedto(do):樂意,蒙
今日3個(gè)行業(yè)逆市上漲。證券時(shí)報(bào)·數(shù)據(jù)寶統(tǒng)計(jì),今日滬深兩市主力資金凈
第一時(shí)間提供各大券商研究所報(bào)告,最大程度減少個(gè)人投資者與機(jī)構(gòu)之間信
在軟件開發(fā)的世界里,故障難免。無(wú)論是初學(xué)者還是經(jīng)驗(yàn)豐富的開發(fā)人員,
在現(xiàn)代應(yīng)用程序開發(fā)中,處理大量異步數(shù)據(jù)流變得越來(lái)越常見。傳統(tǒng)的編程
數(shù)據(jù)倉(cāng)庫(kù)是企業(yè)中存儲(chǔ)和管理大量結(jié)構(gòu)化數(shù)據(jù)的核心組件,用于支持業(yè)務(wù)分