成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么時候我們應談及性能?

開發 項目管理
此文意非強調不能用反射,網上討論也很多,還是老話,根據實際業務情況,具體分析,別整體就惦記和揪著性能不放,比如針對快遞行業,導入和導出操作可謂再正常不過,其導入數量也是龐大,對于此種情況,我們是否可考慮通過結構體存儲數據呢?

[[379516]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky 。轉載本文請聯系JeffckyShare公眾號。   

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

項目性能考慮

此前我個人寫過一版Excel導入和導出,并未使用對應開源組件,因為導出和導入邏輯并不復雜,不涉及單元格拆分、包含圖片、下拉框等等,但處理起來也并沒有什么難度,借助NPOI或EPPLUS工具皆可滿足。

于是我嘗試將此前封裝Excel導入和導出做了進一步重構處理,主要為解決此前遺留問題:

其一:表頭列和實體屬性列順序必須一一對應

其二:導出由于Excel單個Sheet行有限制,超出一定行,必須重建Sheet

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

如上兩點可以簡單解決,這里我們忽略,問題在于第三點,因為使用泛型,針對每一行讀取都會反射對象,同時也要獲取其實例屬性并賦值,這里我們完全可以改善下性能

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

反射性能改善

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

基于上述情況,我們要獲取對應實體所標識的屬性特性,這里為便于后續屬性賦值,我們緩存屬性相關信息,避免頻繁通過反射獲取屬性信息

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

  1. public class Test 
  2.  public int Id { get; set; } 
  3.  public string Name { get; set; } 

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

  1. static void ReflectionExample(int count
  2.     var stopWatch = new Stopwatch(); 
  3.     stopWatch.Start(); 
  4.  
  5.     var tests = Enumerable.Repeat(new Test(), count).ToList(); 
  6.  
  7.     var propertyIdInfo = typeof(Test).GetProperty("Id"); 
  8.     var propertyNameInfo = typeof(Test).GetProperty("Name"); 
  9.  
  10.     foreach (var test in tests) 
  11.     { 
  12.         propertyIdInfo.SetValue(test, 1); 
  13.         propertyNameInfo.SetValue(test, "jeffcky"); 
  14.     } 
  15.  
  16.     Console.WriteLine($"反射賦值耗時:{stopWatch.ElapsedMilliseconds}ms"); 

 

 


 

 

當然,根據筆記本配置以及所使用耗時方案不標準,結果會存在差異,但基本可判斷反射耗時會有20ms以上

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

  1. static void DelegateExample(int count
  2.     var stopWatch = new Stopwatch(); 
  3.     stopWatch.Start(); 
  4.  
  5.     var tests = Enumerable.Repeat(new Test(), count).ToList(); 
  6.  
  7.     var setId = (Action<Test, int>)Delegate.CreateDelegate(typeof(Action<Test, int>), null,  
  8.       typeof(Test).GetProperty("Id").GetSetMethod()); 
  9.  
  10.     var setName = (Action<Test, string>)Delegate.CreateDelegate(typeof(Action<Test, string>), null
  11.       typeof(Test).GetProperty("Name").GetSetMethod()); 
  12.  
  13.     foreach (var test in tests) 
  14.     { 
  15.         setId(test, 3); 
  16.         setName(test, "jeffcky"); 
  17.     } 
  18.  
  19.     Console.WriteLine($"委托賦值耗時:{stopWatch.ElapsedMilliseconds}ms"); 

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

 

通過運行多次,通過調用委托賦值其耗時基本可控制在5ms以內,想想差距還是有點大,接下來我們將數據量直接上升到100萬看看其差距

 

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

為何很多人都說反射性能很差,因為引入反射會通過如下幾步對性能有巨大損耗

其一:檢查所調用方法是否存在

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

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

其四:解出參數

此文意非強調不能用反射,網上討論也很多,還是老話,根據實際業務情況,具體分析,別整體就惦記和揪著性能不放,比如針對快遞行業,導入和導出操作可謂再正常不過,其導入數量也是龐大,對于此種情況,我們是否可考慮通過結構體存儲數據呢?一切皆通過實際場景出發。

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

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2012-07-26 10:27:31

PHP

2023-03-29 15:01:43

微服務開發

2020-05-12 11:25:50

MySQLES數據庫

2017-05-15 09:55:07

2022-06-27 16:55:30

5G6G

2015-07-08 15:55:01

NSStringcopystrong

2024-09-02 08:53:44

2013-11-28 16:03:24

2012-09-24 10:20:39

JavaScriptJS

2022-05-19 10:27:34

機器學習人工智能

2024-08-05 01:22:16

2017-06-28 15:06:51

PythonLambda函數

2019-12-24 11:19:44

容器DockerLinux

2021-08-13 11:31:23

HTTP

2025-05-15 08:50:00

MQRPC架構

2021-09-29 09:24:21

GCGo STW

2015-10-20 15:59:57

注釋代碼程序

2015-10-26 09:38:52

避免注釋代碼

2020-01-05 23:28:51

MQ消息進程

2023-06-06 16:54:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 三级av在线 | 国产激情视频在线免费观看 | 久久精品欧美电影 | 成人h视频在线 | 欧美黑人国产人伦爽爽爽 | 久久亚洲国产精品 | 天天操操操操操 | 亚洲高清在线观看 | 天堂久| 插插插干干干 | 国产激情第一页 | 国产精品大片 | 日韩精品一区二区三区 | 国产精品久久福利 | 久久久久久国产精品久久 | 久久久女女女女999久久 | 国产成人免费视频网站高清观看视频 | www.888www看片 | 精品在线一区二区 | 久久精品在线 | 欧美精品一区二区三区在线播放 | 日韩欧美一二三区 | 欧美精品一区二区三区在线播放 | 成人性视频免费网站 | av大片在线 | 欧美一区二区 | 午夜男人天堂 | 亚洲精品一区在线观看 | 一区二区视频 | 成人在线中文字幕 | 欧美一级免费观看 | 91精品国产一区二区三区动漫 | 久久久久国产精品www | 伊人久久一区二区 | 国产一区二区欧美 | 爱草视频 | 亚洲精品91| 日韩成人一区 | 久久精品国产免费一区二区三区 | 999久久久久久久久6666 | 日韩成人av在线播放 |