C#避坑ToLower和ToUpper,小心把你的系統(tǒng)給拖垮了
不知道何時開始,很多程序員喜歡用ToLower,ToUpper去實現(xiàn)忽略大小寫模式的字符串相等性比較,有可能這個習慣是從別的語言引進的,大膽猜測下是JS,為了不引起爭論,我指的JS是技師的意思~
1. 講故事
在我們一個訂單聚合系統(tǒng)中,每一筆訂單都會標注來源,比如JD,Taobao,Etao,Shopex 等等一些渠道,UI上也提供高級配置輸入自定義的訂單來源,后來客戶反饋輸入xxx查詢不出訂單,這里就拿shopex為例,用戶用小寫的shopex查詢,但系統(tǒng)中標注的是首字母大寫的Shopex,所以自然無法匹配,為了解決這個問題開發(fā)小哥就統(tǒng)一轉(zhuǎn)成大寫做比對,用代碼表示如下:
var orderfrom = "shopex".ToUpper();
customerIDList = MemoryOrders.Where(i =>i.OrderFrom.ToUpper()==orderFrom)
.Select(i => i.CustomerId).ToList();
改完后就是這么牛的上線了,乍一看也沒啥問題,結(jié)果一查詢明顯感覺比之前速度慢了好幾秒,干脆多點幾下,好咯。。。在監(jiān)控中發(fā)現(xiàn)CPU和memory突高突低,異常波動,這位小哥又在寫bug了,查了下代碼問他為什么這么寫,小哥說在js中就是這么比較的~~~
2. string.Compare 改造
其實在C#中面對忽略大小寫形式的比較是有專門的方法,性能高而且還不費內(nèi)存,它就是 string.Compare,所以把上面代碼改成如下就可以了。
var orderfrom = "shopex";
customerIDList = MemoryOrders.Where(string.Compare(i.TradeFrom, tradefrom,StringComparison.OrdinalIgnoreCase) == 0)
.Select(i => i.CustomerId).ToList();
這其中的 StringComparison.OrdinalIgnoreCase枚舉就是用來忽略大小寫的,上線之后除了CPU還是有點波動,其他都沒有問題了。
原文:
https://www.cnblogs.com/huangxincheng/archive/2020/05/04/12827314.html
評論
圖片
表情
