在为Control维护元素列表的过程中,会不可避免的造成性能损耗,我们接下来要探究的就是哪种方式才是我们的最优解。

方案比较

以ComboBox为例,常见的方式一共有两种:Add、AddRange。

Add

List<int> vs = new List<int>();
for (int i = 0; i < 100; i++)
{
vs.Add(i);
}
Stopwatch sw = new Stopwatch();
sw.Start(); comboBox1.Items.Add(vs);
sw.Stop();
TimeSpan ts = sw.Elapsed;
Console.WriteLine("DateTime costed for Shuffle function is: {0}ms", ts.TotalMilliseconds);

DateTime costed for Shuffle function is: 44.9402ms

AddRange

object[] obj = new object[100];
for (int i = 0; i < 100; i++)
{
obj[i] = i;
}
Stopwatch sw = new Stopwatch();
sw.Start();
comboBox1.Items.AddRange(obj);
sw.Stop();
TimeSpan ts = sw.Elapsed;
Console.WriteLine("DateTime costed for Shuffle function is: {0}ms", ts.TotalMilliseconds);

DateTime costed for Shuffle function is: 25.6242ms

试验比较粗糙,但是也反映了一些基本结论:AddRange要比Add的性能高出一些。

探源

public void AddRange(object[] items) {
owner.CheckNoDataSource();
owner.BeginUpdate();
try
{
AddRangeInternal(items);
}
finally
{
owner.EndUpdate();
}
} internal void AddRangeInternal(IList items) { if (items == null)
{
throw new ArgumentNullException("items");
}
foreach (object item in items) {
// adding items one-by-one for performance (especially for sorted combobox)
// we can not rely on ArrayList.Sort since its worst case complexity is n*n
// AddInternal is based on BinarySearch and ensures n*log(n) complexity
AddInternal(item);
}
if (owner.AutoCompleteSource == AutoCompleteSource.ListItems)
{
owner.SetAutoComplete(false, false);
}
}

我们可以看到,对于上面的结论,微软给了我们一个解释:因为Add方法的原理是基于ArrayList,它的性能最低情况为n*n。而AddRange的内部原理则是基于二分法,最低性能为n*log(n),因此当需维护项较多时,应优先考虑使用AddRange进行维护。

Winfrom ComboBox中的性能探索的更多相关文章

  1. 【翻译】.NET 5中的性能改进

    [翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...

  2. 优化Web中的性能

    优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...

  3. Ionic中使用Chart.js进行图表展示以及在iOS/Android中的性能差异

    Angular Chart 简介 在之前的文章中介绍了使用 Ionic 开发跨平台(iOS & Android)应用中遇到的一些问题的解决方案. 在更新0.1.3版本的过程中遇到了需要使用图表 ...

  4. combobox中动态加入几个checkbox,实现下拉框多选

    combobox中动态加入几个checkbox,实现下拉框多选,将一个checkbox选中时其内容就会在combobox中显示出来,将另一个checkbox选中时其内容会跟在第一个checkbox的内 ...

  5. 使用ThinkPHP开发中MySQL性能优化的最佳21条经验

    使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...

  6. Web中的性能优化

    优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争.优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的顺 ...

  7. lua、groovy嵌入到java中的性能对比(转)

    lua和groovy都是可以嵌入到java中的脚本语言.lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能. ...

  8. Lazy<T>在Entity Framework中的性能优化实践

    Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...

  9. winfrom窗体中嵌套WPF控件

    前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...

  10. ComboBox中如何嵌套TreeView控件

      在ComboBox中嵌套TreeView控件,有时候我们在设计界面的时候,由于界面设计的需要,我们需要将TreeView控件嵌套在ComboBox中,因为TreeView控件实在是太占用地方了,要 ...

随机推荐

  1. 大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad

    前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s ️Reference: IoT 边缘计算系列文章 ...

  2. Backbone 网络-ResNet 论文解读

    摘要 残差网络(ResNet)的提出是为了解决深度神经网络的"退化"(优化)问题. 有论文指出,神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声.即更深 ...

  3. Winform 程序多开

    在使用应用程序的过程中,经常要求应用程序只能运行一次.如果发现重复开启,应从系统进程列表中搜索到已经开启的进程,并将该进程窗口移到最前端显示. 记录一下过程. 实现过程 在 Program.cs 文件 ...

  4. 三星为其基于 RISC-V的 Tizen平台移植.NET

    最近.NET团队在这篇文章中介绍了对.NET移植的一般政策:https://devblogs.microsoft.com/dotnet/why-dotnet/#binary-distributions ...

  5. element-ui引入使用

    1.全局引入 main.js import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue. ...

  6. Java第四讲动手动脑

    1. 在以上的代码中,main方法调用的是public void println(Object x),这一方法调用了String类的valueOf方法,valueOf方法内部调用Object. toS ...

  7. svn拉取出现目标机器积极拒绝,无法连接

    问题如图: 前言 这边服务器环境上的SVN仓库地址不能连接,不能提交代码和下载代码了,错误内容就是"由于目标计算机积极拒绝,无法连接.." 出错的原因 询问了相关的事项,知道了这次 ...

  8. err has no member, has initializer but incomplete type

    原因:没有头文件

  9. Qt中的多窗体编程(续二)

    四.实现子窗体的按钮功能. 1.在显示时间的子窗体中,有两个默认的按钮,都还没有定义其功能,下面就来定义,无论单击哪个按钮,都将线束时钟显示的线程并关闭窗体. 2.在子窗体的可视化设计界面中,在窗体的 ...

  10. 找出一组数中出现次数最多的数(csp201312-1)

    问题描述:找出一组数字出现次数最多的数,如果有多个这样的数,输出其中最小的一个. 算法:sort排序,遍历数组,每遍历一个数,查出它已经出现的次数. 代码: #include<bits/stdc ...