मैं WinForms ListView में कुछ हज़ार (जैसे 53,709) आइटम जोड़ रहा हूँ।
प्रयास 1 :13,870 ms
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
यह बहुत बुरी तरह से चलता है। स्पष्ट पहला फिक्स कॉल करना है BeginUpdate/EndUpdate
।
प्रयास 2 :3,106 ms
listView.BeginUpdate();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
listView.EndUpdate();
यह बेहतर है, लेकिन अभी भी परिमाण का एक क्रम बहुत धीमा है। आइए ListViewItems को ListViewItems जोड़ने से अलग करें, ताकि हम वास्तविक अपराधी का पता लगा सकें:
प्रयास 3 :2,631 ms
var items = new List<ListViewItem>();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
items.Add(item);
}
stopwatch.Start();
listView.BeginUpdate();
foreach (ListViewItem item in items)
listView.Items.Add(item));
listView.EndUpdate();
stopwatch.Stop()
असली अड़चन वस्तुओं को जोड़ रही है। चलो AddRange
एक के बजाय इसे परिवर्तित करने का प्रयास करेंforeach
प्रयास 4: 2,182 ms
listView.BeginUpdate();
listView.Items.AddRange(items.ToArray());
listView.EndUpdate();
थोड़ा - सा बेहतर। आइए सुनिश्चित करें कि टोंटी अंदर नहीं हैToArray()
प्रयास 5: 2,132 ms
ListViewItem[] arr = items.ToArray();
stopwatch.Start();
listView.BeginUpdate();
listView.Items.AddRange(arr);
listView.EndUpdate();
stopwatch.Stop();
सीमा सूची में आइटम जोड़ रही है। हो सकता है कि अन्य ओवरलोड AddRange
, जहां हम ListView.ListViewItemCollection
एक सरणी के बजाय जोड़ते हैं
प्रयास 6: 2,141 ms
listView.BeginUpdate();
ListView.ListViewItemCollection lvic = new ListView.ListViewItemCollection(listView);
lvic.AddRange(arr);
listView.EndUpdate();
वैसे यह बेहतर नहीं है।
अब यह फैलने का समय है:
चरण 1 - सुनिश्चित करें कि कोई भी कॉलम "ऑटो-चौड़ाई" पर सेट नहीं है :
जाँच
चरण 2 - सुनिश्चित करें कि सूची दृश्य उन आइटमों को छाँटने की कोशिश नहीं कर रहा है जो हर बार मुझे एक जोड़ते हैं:
जाँच
चरण 3 - स्टैकओवरफ़्लो से पूछें:
जाँच
नोट: जाहिर है यह ListView वर्चुअल मोड में नहीं है; चूंकि आप वर्चुअल सूची दृश्य (आप सेट VirtualListSize
) में आइटमों को "जोड़" नहीं सकते । सौभाग्य से मेरा प्रश्न वर्चुअल मोड में सूची दृश्य के बारे में नहीं है।
क्या मुझे कुछ याद आ रहा है जो सूची में आइटम जोड़ने के लिए इतना धीमा हो सकता है?
बोनस चटर
मुझे पता है कि विंडोज लिस्टव्यू क्लास बेहतर कर सकती है, क्योंकि मैं उस कोड को लिख सकता हूं जो इसे करता है 394 ms
:
ListView1.Items.BeginUpdate;
for i := 1 to 53709 do
ListView1.Items.Add();
ListView1.Items.EndUpdate;
जब समकक्ष C # कोड की तुलना में 1,349 ms
:
listView.BeginUpdate();
for (int i = 1; i <= 53709; i++)
listView.Items.Add(new ListViewItem());
listView.EndUpdate();
तेजी से परिमाण का एक क्रम है।
WinForms ListView आवरण की कौन सी संपत्ति मैं गायब हूँ?