Visual Basic创建数组的最佳实现

时间:2015-03-19 21:35:14

标签: arrays vb.net performance

所以我在浏览MSDN的文档后看到了更快的数组实现,所以我摆弄(请不要拍我)。

https://msdn.microsoft.com/en-us/library/h63fsef3.aspx这表明:

  

在声明和初始化基本数据类型数组时使用{}语法。 >例如,使用以下语法:

   Dim letters5() As String = {"a", "b", "c"}
     

请勿使用以下语法:

   Dim letters6(2) As String
   letters6(0) = "a"
   letters6(1) = "b"
   letters6(2) = "c"`

据我所知,这篇文章是在编码约定的上下文中编写的,并不一定是为了编写速度/效率,但假设我在我的dotnetfiddle中正确测试,Microsoft提示你不使用的后一种语法更快,正确的吗?

https://dotnetfiddle.net/fqK5aQ

1 个答案:

答案 0 :(得分:2)

有趣。看看LINQPad中生成的IL(不知道这与普通编译相比如何 - 我认为它是相同的,但可能是错误的),IL用于初始化数组的两种方式略有不同。

Dim letters5() As String = {"a", "b", "c"}
IL_0000:  ldc.i4.3    
IL_0001:  newarr      System.String
IL_0006:  stloc.1     // VB$LW$t_array$S0
IL_0007:  ldloc.1     // VB$LW$t_array$S0
IL_0008:  ldc.i4.0    
IL_0009:  ldstr       "a"
IL_000E:  stelem.ref  
IL_000F:  ldloc.1     // VB$LW$t_array$S0
IL_0010:  ldc.i4.1    
IL_0011:  ldstr       "b"
IL_0016:  stelem.ref  
IL_0017:  ldloc.1     // VB$LW$t_array$S0
IL_0018:  ldc.i4.2    
IL_0019:  ldstr       "c"
IL_001E:  stelem.ref  
IL_001F:  ldloc.1     // VB$LW$t_array$S0
IL_0020:  stloc.0     // letters5
IL_0021:  ret    

VS

Dim letters6(2) As String
letters6(0) = "a"
letters6(1) = "b"
letters6(2) = "c"
IL_0000:  ldc.i4.3    
IL_0001:  newarr      System.String
IL_0006:  stloc.0     // letters6
IL_0007:  ldloc.0     // letters6
IL_0008:  ldc.i4.0    
IL_0009:  ldstr       "a"
IL_000E:  stelem.ref  
IL_000F:  ldloc.0     // letters6
IL_0010:  ldc.i4.1    
IL_0011:  ldstr       "b"
IL_0016:  stelem.ref  
IL_0017:  ldloc.0     // letters6
IL_0018:  ldc.i4.2    
IL_0019:  ldstr       "c"
IL_001E:  stelem.ref  
IL_001F:  ret        

第一个版本似乎为数组创建了一个临时变量,并将引用复制到实际变量,这需要两个额外的指令。所以,它似乎效率较低,但我认为更好的代码在正常使用中是值得的权衡。