在VB.NET中,用于方法参数ByValByRef的速度更快?

另外,哪个会在运行时(RAM)消耗更多资源?

我通读this question,但答案并不适用或不够具体。

最佳答案

应基于需求和关于其工作方式的知识(而不是速度)来使用Byval和ByRef参数。

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

针对Slough的评论-

哪个在运行时消耗更多资源?

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

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

Improving Performance Through Stack Allocation (.NET Memory Management: Part 2)

哪个更快? ByVal或ByRef。

最好很难准确准确地进行测量-取决于您的测量环境,但是我编写的基准测试称为1亿次,得出以下结论:

  • 引用类型-通过引用:420毫秒
  • 引用类型-通过的Val:382毫秒
  • 值类型-通过引用:421毫秒
  • 值类型-通过的Val:416毫秒

  • 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
    

    注释掉每种方法中的变量和赋值-
  • 引用类型-通过引用:389毫秒
  • 引用类型-通过的Val:349毫秒
  • 值类型-通过引用:416毫秒
  • 值类型-已通过ByVal:385毫秒

  • 可以得出这样的结论:传递引用类型(字符串,类)ByVal将节省一些时间。您可能还说传递值类型(整数,字节)-ByVal将节省一些时间。

    同样,在宏大的计划中,时间可以忽略不计。更重要的是正确使用ByVal和ByRef并了解“幕后”的情况。您的例程中实现的算法最有可能肯定会多次影响程序的运行时间。

    关于vb.net - 哪个更快? ByVal或ByRef?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/408101/

    10-10 22:25