2014-04-10 33 views

回答

4

我認爲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

+0

好,卡利** **做加薪如圖所示的幾個事件(https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/BindableCollection.cs#L166-L168)。 「RemoveRange」的速度非常緩慢。 – JobaDiniz

相關問題