按名称和位置传递参数的性能

时间:2017-02-15 14:27:51

标签: vb.net performance

假设我有以下方法:

Public Sub Foo(ByVal x As Integer, ByVal y As Integer)
{
  ...
}

以下几行之间的表现是否存在差异?

Foo(1,2)
Foo(x:=1, y:=2)
Foo(y:=2, x:=1)

1 个答案:

答案 0 :(得分:1)

执行:否

编译:是 - 微小的退化,不重要

写:是

阅读:是的 - 清晰度得到改善

<强>理由

写 - 很明显,

执行 - :=是一个编译器指令,因此编译后会得到相同的代码,

Benchmark, 1,000,000 iterations Repeat 1,000
Index took - Average: 5.009ms Min: 5ms Max: 8ms
Named took - Average: 5.008ms Min: 5ms Max: 7ms
That is, no difference.

编译 - 命名参数导致查找构造函数,而不是简单的索引。查找需要更多周期。

HOWEVER ,如果你有一系列可选的参数,它会更有用

Public Sub SetSomething(A as integer, B as integer, _
                        Optional C as integer = 0, _
                        Optional D as integer = 0, _
                        Optional E as integer = 0, _
                        Optional F as integer = 0, _
                        Optional G as integer = 0, _
                        Optional H as integer = 0)

 SetSomething(X:=1,Y:=2, H:=42)

阅读

在以后读取代码时使用命名参数会有一些好处,特别是如果参数名称有意义的话。

例如,以下行不仅清楚传递的内容以及文本框应包含的内容,而且还可以很好地猜测函数的作用。

 Net = Calculate(Quantity:= Double.Parse(TextBox1.Text), 
                     CostPerItem:= Double.Parse(TextBox2.Text), 
                     TaxRate:= Double.Parse(TextBox3.Text))

在哪里,这不会告诉你什么

 Net = Calculate(Double.Parse(TextBox1.Text), Double.Parse(TextBox2.Text), Double.Parse(TextBox3.Text))

对于更长的参数列表,此优势会更有帮助,尤其是一些具有多个参数的本机方法,以后您将不会记得。

这是我自己的代码中的另一个例子。

Private Sub Refresh_Searches(ByVal DoCompressor As Boolean, ByVal DoEvaporator As Boolean, ByVal DoCondenser As Boolean, ByVal StartOver As Boolean)

显然我可以通过编写

来调用它
Refresh_Searches(False, True, False, False)

但是当我六个月后回来,或者在我的情况下...... 6分钟,它没有使用鼠标就是胡言乱语。下面的内容要好得多,即使写入时间要长得多。

Refresh_Searches(DoCompressor:=False, _
                 DoCondenser:=True, _
                 DoEvaporator:=False, _
                 StartOver:=False)