簡體   English   中英

c#內存性能和加速

[英]c# Memory performance and speedup

我有一個情況,我需要每次用戶按一個鍵時處理一個20k寄存器的鋸齒狀陣列。 我有一個網格,當用戶輸入時,系統會在網格中顯示過濾結果。 所以。 所以我有一個填充了所有20k寄存器的鋸齒狀陣列。 並且我有一個列表(控件的全局),並且每當用戶按下一個鍵並且只填充過濾的寄存器然后在網格中顯示時,它就會被清理干凈。

這是代碼

the model
public struct PlayerLookUpAdapter
    {
        [Browsable(false)]
        public decimal Id { get; set; }
        [DisplayName("Número")]
        public String Number { get; set; }
        [DisplayName("Nombre")]
        public String Name { get; set; }
        [DisplayName("Apellido")]
        public String Surname { get; set; }
        [DisplayName("DNI")]
        public String Document { get; set; }
        [DisplayName("Estado")]
        public String Status { get; set; }
    }

private PlayerLookUpAdapter[] _source; // here are the 20k registers

List<PlayerLookUpAdapter> filteredOut = new List<PlayerLookUpAdapter>(); // here the filtered ones

// this code is executed every time the user press a key
private void tb_nro_KeyUp(object sender, KeyEventArgs e)
        {
            if (!(e.KeyCode.Equals(Keys.Enter) || e.KeyCode.Equals(Keys.Down)) && _source!=null)
            {
                String text = tb_nro.Text.ToUpper();
                if (String.IsNullOrEmpty(text))
                {
                    fg.DataSource = _source;
                    fg.Refresh();
                    return;
                }
                fg.DataSource = null;
                filteredOut.Clear();
                int length = _source.Length;
                for (int i = 0; i < length; i++)
                {
                    PlayerLookUpAdapter cur = _source[i];
                    if (cur.Number.ToUpper().StartsWith(text) || cur.Surname.ToUpper().StartsWith(text) || cur.Name.ToUpper().StartsWith(text))
                        filteredOut.Add(cur);
                }
                fg.DataSource = filteredOut;
                SetGridColumnsProperties();
                fg.Refresh();

            }
            else
            {
                fg.Focus();
            }
        }

它在內存使用和性能方面是一個很好的解決方案嗎? 你有什么建議嗎? 我怎樣才能獲得更快的速度。 它確實很好用,但是如果我有100k寄存器而不是20k呢?

提前致謝。

我認為這應該是使用樹的一個主要例子。

如果你將數據放在樹中(我實際上不知道C#/ .Net是否支持樹數據結構,或者你自己動手了)。

與在數組中搜索相比,在樹中搜索的速度會增加(因為樹的搜索速度類似於O(n)= n * log(n))

理論很簡單:如果文字中的用戶類型,樹從這個文字開始進入節點,在這個節點上都是可能的其他節點,依此類推。 例如:用戶在“t”中鍵入“t”節點,然后輸入“e”進入子節點“te”,還有一些其他子節點如“test”,系統將向用戶提出這些子節點。

所有你可以改進你的代碼的一切:StartWith方法有一個重載誰也進行字符串比較。 你可以把它設置為“OrdinalIgnoreCase”以避免上升所有字符串,但我不認為你會獲得很多。 你必須加快搜索速度的唯一方法是將搜索引擎作為Lucene.net。

http://www.codeproject.com/KB/library/IntroducingLucene.aspx

你想要一個前綴樹

這是一個實現:

預先計算ToUpper()調用,這樣您就不必每次都這樣做。 您可以維護第二個列表,其中所有字符串都以大寫形式存儲。

其次,如果將密鑰添加到搜索字符串中,則應搜索已過濾的列表(而不是整個列表)。 新的(更長的)字符串永遠不會超出過濾結果。

您可以在字符串比較中使用StringComparison.OrdinalIgnoreCase選項,避免在所有字符串上調用ToUpper 20k次。

理想情況下,首先您需要根據對程序典型使用情況的最佳估計來確定速度有多慢。 畢竟過早優化是萬惡之源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM