Arrays Visual Basic创建数组的最佳实现
因此,在浏览了MSDN的文档之后,我就开始胡思乱想(请不要向我开枪)看看什么是更快的阵列实现 该条规定: 在声明和初始化基本数据类型的数组时使用{}语法。>例如,使用以下语法:Arrays Visual Basic创建数组的最佳实现,arrays,vb.net,performance,Arrays,Vb.net,Performance,因此,在浏览了MSDN的文档之后,我就开始胡思乱想(请不要向我开枪)看看什么是更快的阵列实现 该条规定: 在声明和初始化基本数据类型的数组时使用{}语法。>例如,使用以下语法: Dim letters5() As String = {"a", "b", "c"} Dim letters6(2) As String letters6(0) = "a" letters6(1) = "b
Dim letters5() As String = {"a", "b", "c"}
Dim letters6(2) As String
letters6(0) = "a"
letters6(1) = "b"
letters6(2) = "c"`
不要使用以下语法:
Dim letters5() As String = {"a", "b", "c"}
Dim letters6(2) As String
letters6(0) = "a"
letters6(1) = "b"
letters6(2) = "c"`
我知道这篇文章是在编码约定的背景下编写的,不一定是为了提高速度/效率而编写的,但假设我在dotnetfiddle中测试正确,Microsoft提示您不要使用的后一种语法会更快,对吗
有意思。查看LINQPad中生成的IL(不确定这与正常编译相比如何-我假设它是相同的,但可能是错误的),用于初始化数组的两种方法的IL略有不同
Dim letters5() As String = {"a", "b", "c"}
vs
第一个版本似乎为数组创建了一个临时变量,并将引用复制到实际变量,这需要两条额外的指令。因此,它似乎效率较低,但我认为在正常使用中,更好的代码是值得权衡的。生成的CIL(MSIL)在这两个示例之间的比较如何?对不起,你刚才说得太过分了。我不知道如何访问它,老实说,谷歌在过去一个小时里对我没有太大的帮助。正如戴怀疑的那样,如果将两个代码片段都添加到一个方法中,编译它并使用Redgate Reflector重新创建源代码,我会得到
Dim letters5 As String()=新字符串(){“a”、“b”、“c”}
和Dim letters6 As String())=新字符串(){“a”、“b”、“c”}
。换句话说,这两个代码段都产生相同的可执行代码。您应该能够从dotnetfiddle中查看CIL,不是吗?点击“查看IL”按钮。啊哈,找到了。有趣的。:)我很好奇C#的编译器是否使用其等效语法生成相同的输出。@Dai看起来确实如此,尽管我不得不在LINQPad中禁用优化,否则单行版本被优化掉了,这在开始时添加了一个额外的nop
。:-)嗯,个人喜好,但是我觉得第二个版本看起来更好。至少在未经训练的人看来是这样。无论如何,很高兴知道,除非它是一个大数组,否则它不会有太大的影响。谢谢大家的帮助@AlexGravely我不相信数组大小对开销有任何影响——不管怎样,都是两条额外的指令(是基准测试中的循环造成了差异,所以数组的数量是您应该考虑的)。对于您所使用的,我将以个人偏好或团队标准进行,但第一个好处是,如果您想在中间插入一个值,则不必与其他索引混淆。你总是可以用任何看起来最令人满意的方式将值分割成多行。啊,我明白了。再次感谢!
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