2
添加到BindableCollection中的更好的解決方案,在添加超過1000個對象時似乎非常慢。除非我錯過了一些東西。BindableCollection <> AddRange slow
添加到BindableCollection中的更好的解決方案,在添加超過1000個對象時似乎非常慢。除非我錯過了一些東西。BindableCollection <> AddRange slow
我認爲AddRange速度緩慢的原因是很多NotifyOnPropertyChanged事件被激發。 Caliburn本身不會在添加範圍時引發事件,但BindableColletion會調用其基礎ObservableCollection.InsertItem,然後在每個Item上觸發OnPropertyChanged和OnCollectionChanged。 將BindableColletion複製到一個臨時列表<>,AddRange長列表並創建一個新的BindableCollection(臨時)似乎更快。
我寫了一個簡短的基準。 注意這個例子中的BindableCollection實際上並沒有綁定任何東西,所以在真實世界的情況下,好處應該會更大。
private static void Main()
{
DateTime startTime;
TimeSpan elapsedTime;
var longList = new List<int>(Enumerable.Range(1, 10000000));
var bindableInts = new BindableCollection<int>(Enumerable.Range(1, 100));
startTime = DateTime.Now;
bindableInts.AddRange(longList);
elapsedTime = DateTime.Now - startTime;
Console.WriteLine("Time using AddRange: " + elapsedTime);
bindableInts = new BindableCollection<int>(Enumerable.Range(1, 100));
startTime = DateTime.Now;
var temp = new List<int>(bindableInts);
temp.AddRange(longList);
bindableInts = new BindableCollection<int>(temp);
elapsedTime = DateTime.Now - startTime;
Console.WriteLine("Time using `temp List<>`: " + elapsedTime);
Console.ReadLine();
}
輸出:
時間使用的AddRange:00:00:00.7310548
一次使用臨時表<>:00:00:00.1750151
好,卡利** **做加薪如圖所示的幾個事件(https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/BindableCollection.cs#L166-L168)。 「RemoveRange」的速度非常緩慢。 – JobaDiniz