Winfrom ComboBox中的性能探索
在为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中的性能探索的更多相关文章
- 【翻译】.NET 5中的性能改进
[翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...
- 优化Web中的性能
优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...
- Ionic中使用Chart.js进行图表展示以及在iOS/Android中的性能差异
Angular Chart 简介 在之前的文章中介绍了使用 Ionic 开发跨平台(iOS & Android)应用中遇到的一些问题的解决方案. 在更新0.1.3版本的过程中遇到了需要使用图表 ...
- combobox中动态加入几个checkbox,实现下拉框多选
combobox中动态加入几个checkbox,实现下拉框多选,将一个checkbox选中时其内容就会在combobox中显示出来,将另一个checkbox选中时其内容会跟在第一个checkbox的内 ...
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...
- Web中的性能优化
优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争.优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的顺 ...
- lua、groovy嵌入到java中的性能对比(转)
lua和groovy都是可以嵌入到java中的脚本语言.lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能. ...
- Lazy<T>在Entity Framework中的性能优化实践
Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...
- winfrom窗体中嵌套WPF控件
前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...
- ComboBox中如何嵌套TreeView控件
在ComboBox中嵌套TreeView控件,有时候我们在设计界面的时候,由于界面设计的需要,我们需要将TreeView控件嵌套在ComboBox中,因为TreeView控件实在是太占用地方了,要 ...
随机推荐
- 【NOIP2017提高组正式赛】列队
题解 本题的解法是丰富多彩的! 线段树做法是极好的 代码非常之少 一个很显然的想法是维护 \(n+1\) 颗线段树 那要怎么维护才能不爆空间呢? 我们发现尽管 \(n \times m\) 那么大 但 ...
- Git远程提交的冲突解决
先本地直接提交代码:git push origin master 如果别人在自己之前提交了修改,git会提示push失败,需要先pull远程代码:git pull origin/master (拉取远 ...
- 四川九联代工M301H hi3798 mv300 mt7668魔百和 强刷和TTL线刷(救砖)经验分享
以下都是本次自己操作后的一些经验,不是技术分享,也是看来很多水教程后总结的精华. 四川九联代工M301H hi3798 mv300 mt7668魔百和 一.强刷 1.强刷的教程网上有很多,自己百度. ...
- dot & pixel & point
dpi(dot per inch): 出版质量一般要求dpi在300-600之间. 100dpi = 39.37dpc(dot per cm) 在显示屏幕上,dot=pixel,对于100dpi分辨率 ...
- windows11 安装跳过互联网验证
按住shift+F10 cmd 输入 OOBE\BYPASSNRO 电脑重启后 出现 跳过得按钮
- 01-搭建小巧完善的Kubernetes环境
安装Docker Docker安装和基础命令 安装Minikube minkkube start 安装minikube curl -LO https://storage.googleapis.com/ ...
- DataTransfer.setDragImage()自定义拖拽图像遇到的坑
发生拖动时,从拖动目标(dragstart事件触发的元素)生成半透明图像,并在拖动过程中跟随鼠标指针.这个图片是自动创建的,你不需要自己去创建它.然而,如果想要设置为自定义图像,那么 DataTran ...
- Rancher 使用介绍(可以通过界面管理 K8s 平台)
参考链接 https://blog.csdn.net/weixin_46902396/article/details/122433622 https://www.hugedomains.com/dom ...
- Sublime Text3高效开发之编写代码块(snippet)
看到别人使用HBuilder X可以插入代码块,就想sublime text3有没有类似的功能呢,诶还真有.在sublime text3叫作snippet. -snippet是干什么的?:可以在你编写 ...
- neo4j与jdk版本【转】
根据官网的介绍,目前应该是只有这三个版本相当于主流. Version3.5 使用java1.8 Version4.0+ 官方人员说了目前只支持JDK11 Neo4j Desktop 桌面版本的已经包括 ...