在 VB.NET 中,使用方法参数速度更快,ByVal
or ByRef
?
另外,哪个在运行时消耗更多资源(RAM)?
我通读了这个问题 https://stackoverflow.com/questions/290189/best-practice-byref-or-byval-in-net,但答案不够适用或不够具体。
应根据需求和对其工作原理的了解来使用 Byval 和 ByRef 参数not关于速度。
http://www.developer.com/net/vb/article.php/3669066 http://www.developer.com/net/vb/article.php/3669066
回应斯劳的评论 -
哪个在运行时消耗更多资源?
参数在堆栈上传递。堆栈非常快,因为它的内存分配只是一个指针增量来保留新的“帧”或“分配记录”。大多数 .NET 参数不会超过机器寄存器的大小,如果使用任何“堆栈”空间来传递参数,那么就很小。事实上,基本类型和指针都是在堆栈上分配的。 .NET 中的堆栈大小限制为 1 MB。这应该可以让您了解参数传递消耗的资源有多少。
您可能会发现本系列文章很有趣:
通过堆栈分配提高性能(.NET 内存管理:第 2 部分) 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 亿次的基准得出以下结果:
- 参考类型 - 通过参考传递:420 毫秒
- 参考类型 - Passed ByVal:382 毫秒
- 值类型 - 通过引用传递:421 毫秒
- 值类型 - Passed 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
注释掉每个方法中的变量和赋值 -
- 参考类型 - 通过参考传递:389 毫秒
- 参考类型 - Passed ByVal:349 毫秒
- 值类型 - 通过引用传递:416 毫秒
- 值类型 - Passed ByVal:385 毫秒
人们可以得出结论,传递引用类型(字符串、类)ByVal 将节省一些时间。您可能还会说传递值类型(整数、字节)-ByVal 会节省一些时间。
同样,在宏伟的计划中,时间可以忽略不计。更重要的是正确使用 ByVal 和 ByRef 并了解“幕后”发生的事情。在例程中实现的算法肯定会多次影响程序的运行时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)