BindableCollection<> AddRange慢

时间:2014-04-10 14:00:21

标签: caliburn.micro

添加到BindableCollection的更好解决方案似乎非常慢,添加了1000多个对象。除非我遗漏了什么。

1 个答案:

答案 0 :(得分:4)

我认为AddRange缓慢的原因是许多NotifyOnPropertyChanged事件都被触发了。 Caliburn本身在添加范围时不会引发事件,但是BindableColletion会调用它的基础ObservableCollection.InsertItem,它会在每个Item上触发OnPropertyChanged和OnCollectionChanged。 将BindableColletion复制到临时列表<>,将Long列表添加到它并创建新的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

使用临时列表&lt;&gt;:00:00:00.1750151

的时间