<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      List.Insert 導致的 CPU 爆高

      我們經常會使用 List<T> 作為數據存儲容器。但在某些特殊場景下,List.Insert 方法可能會引發嚴重的性能問題,例如 CPU 占用率飆升。


      示例程序

      以下是一個簡單的控制臺程序,模擬在 List 的開頭不斷插入數據:

      internal class Program
      {
          static void Main(string[] args)
      {
          List<string> numbers = new List<string>();
          string orderNumber = "order12345678912456";
          Console.WriteLine($"從數據庫讀取到數據,逐條放入list");
          Stopwatch sw = Stopwatch.StartNew();
          for (int i = 0; i < 100000; i++)
          {
              numbers.Insert(0, orderNumber); // 每次插入到列表開頭
              //numbers.Add(orderNumber);
              if (i % 1000 == 0)
              {
                  Console.WriteLine($"已插入 {i} 次");
              }
          }
          //numbers.Reverse();
          sw.Stop();
          Console.WriteLine($"插入完成,耗時:{sw.ElapsedMilliseconds} ms,按任意鍵退出...");
          Console.ReadLine();
      }
      }
      

      運行上述代碼后,當插入數據量逐漸增大時,CPU 的占用率會顯著提升,執行完以后CPU恢復正常。原因何在?我們從源碼和數據結構的角度進行分析。


      List.Insert 的底層實現

      以下是 List.Insert 方法的核心實現(通過ILSpy查看):

      public void Insert(int index, T item)
      {
          if ((uint)index > (uint)_size)
          {
              ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_ListInsert);
          }
          if (_size == _items.Length)
          {
              Grow(_size + 1);
          }
          if (index < _size)
          {
              Array.Copy(_items, index, _items, index + 1, _size - index);
          }
          _items[index] = item;
          _size++;
          _version++;
      }
      

      關鍵點:

      1.Array.Copy:當插入位置在列表中間或開頭時,需要將插入點之后的所有元素向后移動一位,以騰出空間存放新元素。
      2.時間復雜度

      ?單次插入操作的時間復雜度為 (O(n)),其中 (n) 是列表的當前長度。
      ?當在循環中多次調用 Insert,整體復雜度會累積。


      插入過程的圖解

      以下用一張圖示意 numbers.Insert(0, i) 的操作過程:

      1.初始狀態:

      [1, 2, 3, 4, 5] (原始數組)`` ^ Insert(0, 10)

      2.插入后:

      [10, 1, 2, 3, 4, 5] (新狀態)

      首先會進行擴容檢查,如果_size已達到_items.Length,會調用EnsureCapacity擴容。在插入過程中,  Array.Copy 從索引 0 開始,將每個元素向右移動一位,最終完成插入。


      復雜度分析

      對于長度為 (n) 的 List,在頭部插入元素的時間復雜度為 (O(n))。在一個循環中執行 (m) 次插入操作,累積復雜度為:

      [ O(1) + O(2) + O(3) + \ldots + O(m) = O\left(\frac{m^2}{2}\right) ]

      示例計算

      假設 List<int> 的長度為 100,000,每次在頭部插入數據:

      ?第 1 次插入移動 0 個元素?第 2 次插入移動 1 個元素?第 3 次插入移動 2 個元素?...?第 100,000 次插入移動 99,999 個元素

      總移動次數為:

      [ T = 0 + 1 + 2 + \ldots + (100,000 - 1) = \frac{(100,000) \times (100,000 - 1)}{2} = 4,999,950,000 ]

      移動了 49.9 億次元素,這就是導致 CPU 爆高的根本原因。


      解決方案

      需要注意的是,LinkedList 的遍歷效率不如 List,因此適用場景有限。

      1. 使用 List.Add + Reverse 優化

      可以先用 List.Add 插入,再調用 Reverse 方法。List.Add 方法,復雜度為 (O(1))。

      var numbers = new List<int>();
      for (int i = 0; i < 100000; i++)
      {
          numbers.Add(orderNumber);
      }
      numbers.Reverse();
      

      2. 使用 LinkedList

      對于頻繁在頭部插入的場景,可以選擇 LinkedList,插入操作復雜度為 (O(1))。

      var linkedNumbers = new LinkedList<int>();
      for (int i = 0; i < 100000; i++)
      {
          linkedNumbers.AddFirst(i);
      }
      

      總結

      List<T> 存放的數據可能有一定量時候,要考慮的List.Insert性能問題。了解常見集合類型及其操作背后的數據結構原理,選擇合適的數據結構。

      posted @ 2025-01-13 23:26  dotNet編程拾光  閱讀(179)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 罗定市| 一区二区国产精品精华液| 国产日韩av免费无码一区二区三区| 日韩精品 在线 国产 丝袜| 日韩成人午夜精品久久高潮| 亚洲色偷偷色噜噜狠狠99| 日本欧美大码a在线观看| 亚洲18禁私人影院| 国产熟女av一区二区三区| 中文国产成人精品久久不卡| 亚洲色av天天天天天天| 国产原创自拍三级在线观看| 国产在线观看网址不卡一区| 国内自拍av在线免费| 色综合色综合久久综合频道| 亚洲欧美一区二区成人片| 国产黄色一级片在线观看| 无码福利写真片视频在线播放| 国产精品毛片一区视频播| 国产大尺度一区二区视频| 亚洲黄日本午夜一区二区| 亚洲人成网站色7799| 人妻精品动漫h无码| 亚洲国产成人久久77| 久久五十路丰满熟女中出| 天天爽夜夜爽人人爽一区二区| 一区二区亚洲人妻av| 一区二区传媒有限公司| 午夜福利国产精品小视频| 亚洲欧美不卡高清在线| 欧美亚洲一区二区三区在线| 新婚少妇无套内谢国语播放| 狼人大伊人久久一区二区| 国产99视频精品免费视频36| 亚洲AV天天做在线观看| 九九热在线免费观看视频| 最新亚洲人成网站在线观看| 在线精品视频一区二区| 张家界市| 又粗又硬又黄a级毛片| 五月婷婷久久中文字幕|