gpt4 book ai didi

vb.net - 哪个更快? ByVal 还是 ByRef?

转载 作者:行者123 更新时间:2023-12-03 07:52:14 25 4
gpt4 key购买 nike

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

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

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

最佳答案

Byval 和 ByRef 参数的使用应该基于需求和它们如何工作的知识,而不是速度。

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

回应斯劳的评论——

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

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

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

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

哪个更快? ByVal 或 ByRef。

准确和准确地测量充其量是困难的——这取决于你测量的上下文,但是我写的一个基准测试调用了一个方法 1 亿次得出以下结果:

  • 引用类型 - 传递 ByRef:420 毫秒
  • 引用类型 - 传递 ByVal:382 毫秒
  • 值类型 - Passed ByRef: 421 ms
  • 值类型 - ByVal 传递: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

    注释掉每个方法中的变量和赋值 -
  • 引用类型 - 传递 ByRef:389 毫秒
  • 引用类型 - 传递 ByVal:349 毫秒
  • 值类型 - Passed ByRef: 416 ms
  • 值类型 - ByVal 传递:385 毫秒

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

    再一次,在宏伟的计划中,时间可以忽略不计。更重要的是正确使用 ByVal 和 ByRef 并了解“幕后”发生的事情。在你的例程中实现的算法肯定会多次影响你的程序的运行时间。

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com