当前位置:首页 >> 偏方秘方 >> 录一次 .NET 某医保平台 CPU 爆高分析

录一次 .NET 某医保平台 CPU 爆高分析

发布时间:2024-01-14

0007ff887d7778e System.Linq.Enumerable+WhereListIteratorMLT-1[[System.__Canon, mscorlib]].MoveNext()0000009588e7e3e0 00007ff887d7767e System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerableMLT-1)...

从驱动以及视频来看,有 38 个寄存支架早就执行 xxx.DesDecrypt 步骤,像是是一个 DES 档案资料加载,多半是 加档案资料 比较付CPU资源,看样子告知他到解决透实根了,根据寄存支架栈告知他一下标识符到底是怎么写下的,为了核查起见,这里就多用几个 XXX 来替代吧,参考资料标识符如下:

protected void xxx(string xxx) { xxx userInfo = xxxUserInfoList.Where((xxx p) => p.xxx.Name == xxx.DesDecrypt(base.User.Name)).FirstOrDefault(); }

何在第一眼碰到在 Where 之中可用 DesDecrypt(base.User.Name) 步骤,虽然有点吓人,思绪还是感觉扩展步骤应当不会帮我最优化把它单独给提出来的,比如下面这样。

protected void xxx(string xxx) { var nameWhere= xxx.DesDecrypt(base.User.Name); xxx userInfo = xxxUserInfoList.Where((xxx p) => p.xxx.Name == nameWhere).FirstOrDefault(); }

但看了寄存支架栈上的 WhereListIterator 和 FirstOrDefault 步骤,貌似没做到最优化,为了实验者我的想要,我还有意写下了段标识符。

internal class Program { static void Main(string[] args) { var query = new List() { "1", "2","3","4" }; var text = "hello world"; query.Where(i => i == Run(text)).FirstOrDefault(); } public static string Run(string str) { Console.WriteLine(str); return str; } }

从驱动结果看 hello world 驱动了 4 次,也就表明近期并没做到任何最优化。

再说是点题外话,最近在科学研究 SQLSERVER,我或许它的 SQL最优化支架应当尽或许检视这种情况,视频如下:

SELECT OrderID FROM dbo.OrdersWHERE OrderDate> SUBSTRING('1996-07-10 00:00:10.000', 0, 11) AND OrderDate < SUBSTRING('1996-07-20 00:00:20.000', 0, 11);

虽然 SQLSERVER 相当智能的做到了最优化,但后来想一想C#不最优化是对的,因为构建标识符根本无法尽或许向 xxx.DesDecrypt 步骤之中传布相同参数,留在的结果一定是相同的,所以采行保守的步骤尽或许理解。

2. 档案资料加载或许不会爆较低吗

就算WHERE之中可否检视档案资料加载就一定不会爆较低吗?这是一个需要澄清的解决透实,可以透到某个寄存支架上用 !dso 告知他出那个 list,然后 !do 即可,参考资料标识符如下:

0:234> !DumpObj /d 000001f631799240Name: System.Collections.Generic.ListMLT-1[[xxxx_UserInfo,xxxx]]MethodTable: 00007ff82f5f3b20EEClass: 00007ff88ab59f90Size: 40(0x28) bytesFile: C:WindowsMicrosoft.NetassemblyGAC_64mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dllFields: MT Field Offset Type VT Attr Value Name00007ff88b12d6c8 4001843 8 System.__Canon[] 0 instance 000001f6b14ae380 _items00007ff88b123e98 4001844 18 System.Int32 1 instance 3506 _size00007ff88b123e98 4001845 1c System.Int32 1 instance 3506 _version00007ff88b121c98 4001846 10 System.Object 0 instance 0000000000000000 _syncRoot00007ff88b12d6c8 4001847 8 System.__Canon[] 0 static

从驱动可以清晰的碰到,近期的 list.count=3506 个,在加上有 38 个寄存支架在并发检视,所以最坏完全是 3506 * 38 = 13w 的档案资料加载,自嘲说是期中的时候 CPU 爆较低。

解决透实也很有用,把 xxx.DesDecrypt 给提出来,将档案资料加载由原来的 13w 最优化到 38 次,晚间大保姆级联解决透实已经解决。

碰到大保姆爸爸的大笑了,我的红豆有着落了

三:归纳

这个解决透实是一个不良习惯的拼写下产生的,何在,我不是碰到寄存支架栈上的 WhereListIterator 步骤我也不相信不会执行多次,或许最近之中了 SQLSERVER 的有毒,不管怎么说是,这些都是小事,有大餐吃才是最重要的!

神疲乏力怎么可以治疗
颈椎病怎么止痛
拉稀便可以服肠炎宁吗
一直拉肚子怎么办
科兴制药
标签:
友情链接: