2010-07-22 5 views
14

मुझे एक सुंदर उच्च आवृत्ति (कुछ मामलों में प्रति पंक्ति 10 पंक्तियों तक) में जोड़े गए ग्रिड में बहुत सारी पंक्तियां प्रदर्शित करने की आवश्यकता है मैंने ListView चुना क्योंकि मुझे लगता है कि WPF में सबसे तेज़ ग्रिड नियंत्रण है। (निश्चित रूप से ग्रिड व्यू से बहुत तेज़)WPF: ListView में आइटम जोड़ने का सबसे प्रभावी/तेज़ तरीका क्या है?

कुछ सौ हजार आइटम जोड़े जाने के बाद सीपीयू उपयोग बहुत अधिक हो जाता है और वे अंदर आते रहते हैं। यह आश्चर्यजनक है, क्योंकि ListView केवल दृश्य पंक्तियों को प्रस्तुत करता है, इसलिए इससे कोई फर्क नहीं पड़ता कि कैसे कुल में कई जोड़े गए हैं।

मेरा पहला दृष्टिकोण इसे ऑब्जर्जेबल कोलेक्शन पर बाध्य कर रहा था लेकिन थोड़ी देर के बाद, सीपीयू उपयोग बढ़ जाता है, और पूरी खिड़की झटकेदार हो जाती है।

मैंने इसे नियमित सूची में बाध्य करने की कोशिश की, जो कि तेजी से प्रतीत होता है, हालांकि मुझे अक्सर सूची में Refresh() को कॉल करने की आवश्यकता होती है, जो थोड़ी देर बाद सीपीयू को भी स्लैम करता है।

मैंने subclassing ObservableCollection को चंक आवेषणों के लिए प्रयास करने की उम्मीद की थी कि उन्हें बैच करने से प्रदर्शन/कमी सीपीयू वर्कलोड में सुधार होगा, लेकिन इस दृष्टिकोण को संग्रह दृश्य को देखने की आवश्यकता होती है। रीफ्रेश जो संग्रह पर रीसेट() को कॉल करने जैसा ही है, और यह भी अनुपयोगी है संग्रह में बहुत सारी चीज़ें हैं।

अवलोकन करने योग्य चयन को साफ़ करना और myListView.Items.Refresh() को कॉल करने से पहले इसे 0 पर वापस लाने के लिए सीपीयू उपयोग को शुरुआती बिंदु पर वापस लाता है।

यहां विचारों से बाहर निकलना शुरू हो रहा है .. फिर, मेरा लक्ष्य यहां बहुत सारे आइटम जोड़ना/प्रदर्शित करना और 8 कॉलम ग्रिड प्रदर्शित करना है, सबसे प्रदर्शनकारी तरीके से .. ListView अच्छा लगता है, बस कुछ होना है

  • (75%) सिस्टम: तरीके मैं आगे यह tweak सकता है ..

    अद्यतन

    रूपरेखा के बाद

    , ग्रिड में ObservableCollection 800k पंक्तियाँ, सबसे cpu गहन कार्य किया जाता है। Windows.Media.MediaContext.RenderMessa geHandler (वस्तु resizedCompositionTarget)

  • (20%) ObservableCollection.OnCollectionChanged (NotifyCoolectionChanged ..)

हालांकि सत्र उन संख्याओं को काफी भिन्नता ..

अद्यतन 2 के आधार पर .. ठीक BindingList प्रतीत होता है यहां स्पष्ट विजेता।

यहाँ

1 लाख पंक्तियों के साथ परिणाम (टिक) में कंधे से कंधा मिलाकर कर रहे हैं प्रत्येक (और प्रति सेकंड 10 आइटम जोड़ने):

ObservableCollection: http://i.imgur.com/7ZoSv.png

BindingList http://i.imgur.com/jm5qF.png

आप कर सकते हैं सीपीयू गतिविधि में समग्र गिरावट देखें, और बाध्यकारी सूची मामले में पेड़ को संसाधित करने के लिए आवश्यक आधा टिक! इस महान विचार के लिए आकाश का धन्यवाद।

उत्तर

16

ऑब्जर्जेबल कोलेक्शन का उपयोग करने के बजाय मैं बाइंडिंगलिस्ट क्लास का सुझाव दूंगा, आप ऐसा कुछ कर सकते हैं ..

BindingList<string> list = new BindingList<string>(); 

list.AllowEdit = true; 
list.AllowNew = true; 
list.AllowRemove = true; 

// set the list as items source 
itemCollection.ItemsSource = list; 

// add many items... 

// disable UI updation 
list.RaiseListChangedEvents = false; 

for each(string s in MyCollection){ 
    list.Add(s); 
} 

// after all.. update the UI with following 
list.RaiseListChangedEvents = true; 
list.ResetBindings(); // this forces update of entire list 

आप सक्षम/बजाय एक शॉट में सब कुछ जोड़ने, BindingList है मेरे सारे यूआई में बेहतर तो ObservableCollection कार्यरत की, बैचों में भी अद्यतन करने को अक्षम, मुझे आश्चर्य है कि क्यों हर जगह लोगों ObservableCollection के बारे में अधिक बात करते हैं जब BindingList वास्तव में superseds कर सकते हैं ObservableCollection।

+0

आकाश, इसके लिए धन्यवाद। मैं जल्द ही इस संग्रह का परीक्षण करूंगा। एक बात मैं उत्सुक हूं, अगर बैच प्रविष्टियों को पूरी सूची को ताज़ा करने के लिए कोई तरीका है। मेरा मानना ​​है कि यह बहुत जिटर और सीपीयू काम का स्रोत है, जब 800k आइटम रीफ्रेश किए जाते हैं आदि –

+0

मुझे नहीं लगता कि यह 800k आइटम रीफ्रेश करेगा, क्योंकि वर्चुअलाइज्ड पैनल केवल स्क्रीन पर सीमित आइटम रीफ्रेश करेगा। हालांकि, मेरे ऐप्स में कुछ प्रकार के पेजर के साथ आपके आइटम को पेज करना होगा, मैं केवल पहले 0-20 लोड करता हूं और उपयोगकर्ता को एक-दूसरे को नेविगेट करने देता हूं, वे कुछ प्रकार की खोज –

+2

का उपयोग करके फ़िल्टर कर सकते हैं, क्या आपने फ़िल्टरिंग की कोशिश की है आपकी बाध्यकारी सूची? ObservableCollection के साथ, मैं CollectionViewSource का उपयोग कर रहा था क्योंकि यह एक फ़िल्टर प्रदान करता है, जो फ़िल्टर प्रत्येक अतिरिक्त आइटम पर निष्पादित करता है। यह फ़िल्टर रीफ्रेश के बाद सभी पंक्तियों पर निष्पादित होने की संभावना है। तो मुझे फ़िल्टरिंग जोड़ने के लिए एक और तरीका खोजने की आवश्यकता होगी। –

संबंधित मुद्दे