在为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. Commons-Collections反序列化

    Java反序列化漏洞 Commons Collections Apache Commons 是 Apache 软件基金会的项目.Commons Collections 包为 Java 标准的 Coll ...

  2. 基于C++的OpenGL 06 之摄像机

    1. 引言 本文基于C++语言,描述OpenGL的摄像机 前置知识可参考: 基于C++的OpenGL 05 之坐标系统 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多 ...

  3. uniapp 自定义 picker

    前言 我们在开发的过程中经常会遇到现有插件无法满足需求的情况,毕竟不是组件库不能满足项目所有需求,这时就需要我们自己去构建组件. 写这篇博文也是记录我平时开发的,以后可能会用得到的东西.希望大家看到本 ...

  4. script和template里可选链运算符?.报错Syntax Error: Unexpected token (64:2)

    前情:babel-core@6.2.3,  vue@2.7.14 试过的方法:1.安装@babel/plugin-proposal-optional-chaining,设置.babelrc文件如下,报 ...

  5. js获取浏览器宽度和高度值

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>请调整浏览器窗口</t ...

  6. mysql常用命令汇总

    1.查询表占用空间语句:SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', table_rows AS 'Number of Row ...

  7. 洛谷 P6021 洪水

    题意 给定一棵有 \(n\) 个结点的树,点有点权:一共有 \(m\) 次操作,每次操作包括以下两种: 在一个点的子树中删去一些结点,使得该子树中所有叶结点与该子树的根结点不连通,并且使删去的点的点权 ...

  8. vue实现瀑布流

    <template> <div id="app"> <ul> <li ref='waterfallItem' v-for="(i ...

  9. C# Post调用接口并传递json参数

    1 public string Post(string Url, string jsonParas) 2 { 3 string strURL = Url; 4 //创建一个HTTP请求 5 HttpW ...

  10. VMware-共享文件夹挂载

    [root@localhost jiangyinuo]# cd /cdromobash: cd: /cdromo: 没有那个文件或目录[root@localhost jiangyinuo]# cd / ...