发布于 2009-01-02 22:02:03
Byval和ByRef参数应该基于需求和他们如何工作的知识,而不是速度。
http://www.developer.com/net/vb/article.php/3669066
对于Slough的评论-
在运行时消耗更多资源的?
参数在堆栈上传递。堆栈非常快,因为它的内存分配只是一个指针增量,以保留一个新的“框架”或“分配记录”。如果使用“堆栈”空间来传递参数,大多数.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亿次,得到了以下结果:
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注释掉每个方法中的变量和赋值-
可以得出结论,传递引用类型(字符串、类) ByVal将节省一些时间。您还可以说传递值类型(整数、字节)- ByVal将节省一些时间。
再一次,时间在宏伟的计划中是微不足道的。更重要的是正确使用ByVal和ByRef,并理解“幕后”发生的事情。在例程中实现的算法肯定会更多地影响程序的运行时。
发布于 2009-01-02 22:03:03
如果您使用的值类型非常大(例如,Guid相当大),则通过引用传递参数可能要快得多。在其他情况下,通过引用传递的复制等可能比按值传递的要多--例如,如果您有一个字节参数,那么一个字节显然小于指针通过引用传递它时所使用的4或8个字节。
在实践中,你几乎不应该担心这个。尽可能编写最易读的代码,这几乎总是意味着通过值而不是引用传递参数。我很少使用ByRef。
如果您想提高性能,并且认为ByRef会帮助您,请在提交之前仔细地对它进行基准测试(在您的确切情况下)。
编辑:我在评论中注意到另一个(以前接受,现在删除)的回答,对于ByRef与ByVal在价值类型方面的含义存在很大的误解。我有一个多年来被证明流行的关于参数传递的文章 --它是用C#术语表示的,但同样的概念也适用于VB.NET。
发布于 2009-01-02 21:55:26
那得看情况。如果要传递一个对象,它已经在传递一个指针。这就是为什么如果您传入一个ArrayList (例如),并且您的方法向ArrayList添加了一些内容,那么调用代码也有相同的对象到它的ArrayList中,这是传入的,因为它是相同的ArrayList。它唯一不传递指针的情况是,当您将具有内部数据类型的变量(如int或double )传递到函数时。在这一点上,它创建一个副本。但是,这些对象的数据大小太小了,因此无论从内存使用情况还是执行速度上来说,都几乎没有什么不同。
https://stackoverflow.com/questions/408101
复制相似问题