日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么时候我们应谈及性能?

發(fā)布時(shí)間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么时候我们应谈及性能? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【導(dǎo)讀】實(shí)際項(xiàng)目開發(fā)中、有部分童鞋可能無時(shí)無刻都在關(guān)注性能,那么我們到底應(yīng)該什么時(shí)候關(guān)注性能呢?

個(gè)人以為,性能并非一次性就可完全成全,需結(jié)合實(shí)際業(yè)務(wù)有一個(gè)大致評估或預(yù)期,比如數(shù)據(jù)量大小,若預(yù)期短暫并不會達(dá)到性能瓶頸,大可不必過度考慮,又或者根據(jù)自我假想可能存在性能問題,于是大張旗鼓陷入自我意識流,最終可能結(jié)果吃虧反而不討好

項(xiàng)目性能考慮

此前我個(gè)人寫過一版Excel導(dǎo)入和導(dǎo)出,并未使用對應(yīng)開源組件,因?yàn)閷?dǎo)出和導(dǎo)入邏輯并不復(fù)雜,不涉及單元格拆分、包含圖片、下拉框等等,但處理起來也并沒有什么難度,借助NPOI或EPPLUS工具皆可滿足

于是我嘗試將此前封裝Excel導(dǎo)入和導(dǎo)出做了進(jìn)一步重構(gòu)處理,主要為解決此前遺留問題:

其一:表頭列和實(shí)體屬性列順序必須一一對應(yīng)

其二:導(dǎo)出由于Excel單個(gè)Sheet行有限制,超出一定行,必須重建Sheet

其三:大量使用反射,若存在多個(gè)Sheet,且每個(gè)Sheet行數(shù)量稍微巨大,則存在一定性能瓶頸

如上兩點(diǎn)可以簡單解決,這里我們忽略,問題在于第三點(diǎn),因?yàn)槭褂梅盒?#xff0c;針對每一行讀取都會反射對象,同時(shí)也要獲取其實(shí)例屬性并賦值,這里我們完全可以改善下性能

接下來,我們通過一個(gè)簡單例子,來演示如何改善反射性能,當(dāng)然,也還有其他方案,這里我只介紹我個(gè)人的方案

反射性能改善

如一部分開源組件一樣,我們通過特性標(biāo)識屬性,屬性名稱和表頭列匹配,順序無需一致,同樣,屬性可忽略賦值

基于上述情況,我們要獲取對應(yīng)實(shí)體所標(biāo)識的屬性特性,這里為便于后續(xù)屬性賦值,我們緩存屬性相關(guān)信息,避免頻繁通過反射獲取屬性信息

接下來,我們來到屬性賦值和獲取,我們以設(shè)置值為例,獲取值同理,同時(shí)以1萬作為基數(shù)來驗(yàn)證,然后以此基數(shù)遞增,如下測試實(shí)體

public?class?Test {public?int?Id?{?get;?set;?}public?string?Name?{?get;?set;?} }

反射屬性賦值示例,如下:

static?void?ReflectionExample(int?count) {var?stopWatch?=?new?Stopwatch();stopWatch.Start();var?tests?=?Enumerable.Repeat(new?Test(),?count).ToList();var?propertyIdInfo?=?typeof(Test).GetProperty("Id");var?propertyNameInfo?=?typeof(Test).GetProperty("Name");foreach?(var?test?in?tests){propertyIdInfo.SetValue(test,?1);propertyNameInfo.SetValue(test,?"jeffcky");}Console.WriteLine($"反射賦值耗時(shí):{stopWatch.ElapsedMilliseconds}ms"); }

當(dāng)然,根據(jù)筆記本配置以及所使用耗時(shí)方案不標(biāo)準(zhǔn),結(jié)果會存在差異,但基本可判斷反射耗時(shí)會有20ms以上

接下來,我使用委托方式來直接調(diào)用屬性Set方法,看看性能是否會有改善

static?void?DelegateExample(int?count) {var?stopWatch?=?new?Stopwatch();stopWatch.Start();var?tests?=?Enumerable.Repeat(new?Test(),?count).ToList();var?setId?=?(Action<Test,?int>)Delegate.CreateDelegate(typeof(Action<Test,?int>),?null,?typeof(Test).GetProperty("Id").GetSetMethod());var?setName?=?(Action<Test,?string>)Delegate.CreateDelegate(typeof(Action<Test,?string>),?null,typeof(Test).GetProperty("Name").GetSetMethod());foreach?(var?test?in?tests){setId(test,?3);setName(test,?"jeffcky");}Console.WriteLine($"委托賦值耗時(shí):{stopWatch.ElapsedMilliseconds}ms"); }

接下來,我們對比反射1萬條數(shù)據(jù)屬性賦值,看看耗時(shí)情況怎樣

通過運(yùn)行多次,通過調(diào)用委托賦值其耗時(shí)基本可控制在5ms以內(nèi),想想差距還是有點(diǎn)大,接下來我們將數(shù)據(jù)量直接上升到100萬看看其差距

結(jié)果顯而易見,通過反射耗時(shí)將超過1s,而委托賦值則控制在幾十ms,如果再加上屬性的個(gè)數(shù)和獲取屬性值,耗時(shí)時(shí)間勢必將會再一次拉大

為何很多人都說反射性能很差,因?yàn)橐敕瓷鋾ㄟ^如下幾步對性能有巨大損耗

其一:檢查所調(diào)用方法是否存在

其二:檢查其安全性和訪問可見性

其三:檢查簽名,確保所提供的參數(shù)和類型的數(shù)量與方法定義簽名一致

其四:解出參數(shù)

此文意非強(qiáng)調(diào)不能用反射,網(wǎng)上討論也很多,還是老話,根據(jù)實(shí)際業(yè)務(wù)情況,具體分析,別整體就惦記和揪著性能不放,比如針對快遞行業(yè),導(dǎo)入和導(dǎo)出操作可謂再正常不過,其導(dǎo)入數(shù)量也是龐大,對于此種情況,我們是否可考慮通過結(jié)構(gòu)體存儲數(shù)據(jù)呢?一切皆通過實(shí)際場景出發(fā)。

那么問題來了,寫本文的目的是什么呢?

?????時(shí)常自我多學(xué)習(xí),多思考,多嘗試,多積累是否存在更好解決方案,我們都可明顯覺察,玩來玩去就那么點(diǎn)語法,為什么別人就能玩出不一樣的花樣,問題在哪里?

總結(jié)

以上是生活随笔為你收集整理的什么时候我们应谈及性能?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。