本文对我的上一篇文章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