【Winform】ListView虚拟模式与普通模式的性能对比 -- 深入分析

本文对Winform ListView的虚拟模式与普通模式进行深度分析,通过IL反编译揭示两者在数据添加方式上的差异。虚拟模式通过事件RetrieveVirtualItem动态赋值,仅创建一个对象并覆盖原有数据,提高了性能。这种方式为优化大量对象创建提供了思路。
摘要由CSDN通过智能技术生成

本文对我的上一篇文章ListView虚拟模式与普通模式的性能对比进行了更深入的分析。上一篇文章可视为如何使用虚拟模式,这篇文章分析了虚拟模式的原理。

1、 从代码上分析:

普通模式使用的是Collection.Add()这种方法来添加数据。

虚拟模式使用的是在事件RetrieveVirtualItem中使用e.Item = Collection[e.ItemIndex];这种方法来添加数据。

貌似看不出什么端倪,那么我们请出IL DSAM反编译生成的exe文件来从IL上分析。

2、 从IL分析:(IL代码部分省略,只显示关键部分。)

普通模式Collection.Add()和虚拟模式e.Item = Collection[e.ItemIndex]

普通模式IL代码如图:

.method private hidebysig instance void  Btn_GenerateClick(object sender,
                                                           class [mscorlib]System.EventArgs e) cil managed
{
  // Code size       222 (0xde)
  .maxstack  5
  .locals init (int32 V_0,
           int32 V_1,
           int32 V_2,
           int32 V_3,
           int32 V_4,
           int32 V_5)
  IL_0000:  ldarg.0
  IL_0001:  ldnull
  IL_0002:  stfld      class [System.Windows.Forms]System.Windows.Forms.ListViewItem[] ListViewVirtualMode.ListViewWithoutVirtualMode::_itemsCacheCollection
  IL_0007:  ldarg.0
  IL_0008:  ldfld      class [System.Windows.Forms]System.Windows.Forms.ListView ListViewVirtualMode.ListViewWithoutVirtualMode::listView1
  IL_000d:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.ListView::Clear()
  IL_0012:  ldarg.0
  IL_0013:  ldfld      class [System.Windows.Forms]System.Windows.Forms.TextBox ListViewVirtualMode.ListViewWithoutVirtualMode::textBox_RowTotal
  IL_0018:  callvirt   instance string [System.Windows.Forms]System.Windows.Forms.Control::get_Text()
  IL_001d:  call       int32 [mscorlib]System.Convert::ToInt32(string)
  IL_0022:  stloc.0
  IL_0023:  ldarg.0
  IL_0024:  ldloc.0
  IL_0025:  newarr     [System.Windows.Forms]System.Windows.Forms.ListViewItem
  IL_002a:  stfld      class [System.Windows.Forms]System.Windows.Forms.ListViewItem[] ListViewVirtualMode.ListViewWithoutVirtualMode::_itemsCacheCollection
  IL_002f:  ldarg.0
  IL_0030:  ldfld      class [System.Windows.Forms]System.Windows.Forms.CheckBox ListViewVirtualMode.ListViewWithoutVirtualMode::checkBox_PictureCol
  IL_0035:  callvirt   instance bool [System.Windows.Forms]System.Windows.Forms.CheckBox::get_Checked()
  IL_003a:  brtrue.s   IL_006c
  I
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值