vb.net – 哪个更快? ByVal或ByRef?

在VB.NET中,它更快地用于方法参数,ByVal或ByRef?

此外,它在运行时消耗更多的资源? (随机存取存储器)

编辑:我阅读this question,但答案不适用或具体不够。

应该根据需求和知识来使用Byval和byref参数,它们如何不按速度工作。

http://www.developer.com/net/vb/article.php/3669066

编辑

回应斯劳的评论

在运行时消耗更多的资源?

参数在堆栈上传递。栈是非常快的,因为它的内存分配只是一个指针增量来保留一个新的“帧”或“分配记录”。大多数.NET参数不超过机器寄存器的大小,所以很少使用任何“堆栈”空间来传递参数。事实上,基本类型和指针都在堆栈上分配。 .NET中的堆栈大小限制为1MB。这应该让你了解参数传递消耗的资源有多少。

你可能会发现这一系列的文章很有趣:

http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/15/improving-performance-through-stack-allocation-net-memory-management-part-2.aspx

哪个更快? ByVal或ByRef。

很难测量准确和仙女 – 取决于你的测量的上下文,但一个基准,我写了一个方法1亿次出现了以下:

>参考类型 – Passed ByRef:420ms
>参考类型 – Passed ByVal:382ms
>值类型 – 传递ByRef:421ms
>值类型 – 传递ByVal:416ms

Public Sub Method1(ByRef s As String)
    Dim c As String = s
End Sub

Public Sub Method2(ByVal s As String)
    Dim c As String = s
End Sub

Public Sub Method3(ByRef i As Integer)
    Dim x As Integer = i
End Sub

Public Sub Method4(ByVal i As Integer)
    Dim x As Integer = i
End Sub

Sub Main()

    Dim s As String = "Hello World!"
    Dim k As Integer = 5

    Dim t As New Stopwatch

    t.Reset()
    t.Start()
    For i As Integer = 0 To 100000000
        Method1(s)
    Next
    t.Stop()

    Console.WriteLine("Reference Type - ByRef " & t.ElapsedMilliseconds)

    t.Reset()
    t.Start()
    For i As Integer = 0 To 100000000
        Method2(s)
    Next
    t.Stop()

    Console.WriteLine("Reference Type - ByVal " & t.ElapsedMilliseconds)

    t.Reset()
    t.Start()
    For i As Integer = 0 To 100000000
        Method3(i)
    Next
    t.Stop()

    Console.WriteLine("Value Type - ByRef " & t.ElapsedMilliseconds)

    t.Reset()
    t.Start()
    For i As Integer = 0 To 100000000
        Method4(i)
    Next
    t.Stop()

    Console.WriteLine("Value Type - ByVal " & t.ElapsedMilliseconds)

    Console.ReadKey()

End Sub

注释每个方法中的变量和赋值 –

>参考类型 – Passed ByRef:389ms
>参考类型 – Passed ByVal:349ms
>值类型 – Passed ByRef:416ms
>值类型 – 传递ByVal:385ms

可以得出结论,传递引用类型(字符串,类)byval将节省一些时间。您还可以说传递值类型(整数,字节) – byval将节省一些时间。

再次,时间在物质的大计划中可以忽略不计。更重要的是正确使用byval和byref,并理解幕后的情况。在你的例程中实现的算法将会更多地影响你的程序的运行时。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...