哪个更快? ByVal 还是 ByRef?

2024-02-15

在 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(使用前将#替换为@)

哪个更快? ByVal 还是 ByRef? 的相关文章

  • 我应该在 VS Code 中为“json.maxItemsCompulated”设置什么?

    默认状态为 5000 个符号 这取决于机器的性能还是其他什么 从 VS Code 设置 JSON 计算的最大项目数 计算的轮廓符号和折叠区域的最大数量 由于性能原因而受到限制 这与编辑器中的 GUI 按钮相关 您可以使用它来折叠 JSON
  • 性能 - String.charAt(0) 与 /^.{1}/

    从概念上讲哪个应该更快 String charAt 0 or 1 regex String charAt 0 必须处理和应用正则表达式 速度测试资源 Paul S https stackoverflow com users 1615483
  • 如何从 System.Web.HttpPostedFileBase 转换为 System.Web.HttpPostedFile?

    在尝试实现 MVC 文件上传时example http www hanselman com blog ABackToBasicsCaseStudyImplementingHTTPFileUploadWithASPNETMVCIncludin
  • 改进绩效反思 - 我应该考虑哪些替代方案?

    我需要动态地设置对象上的一堆或属性的值 将其称为传输对象 将在短时间内创建相当数量的此类传输对象并设置其属性 我想避免使用反射 还有其他选择吗 如果是的话 有我可以查看的示例实现吗 Use Delegate CreateDelegate h
  • 为什么 Python 对于一个简单的 for 循环来说这么慢?

    我们正在做一些kNN and SVDPython 中的实现 其他人选择了 Java 我们的执行时间非常不同 我使用 cProfile 来查看我在哪里犯了错误 但一切都很好fine http wiki python org moin Pyth
  • ElasticSearch 匹配多个前缀术语

    我试图为 ElasticSearch 提供一个包含多个术语的查询 然后给出匹配的文档 其中指定的术语位于目标字段中的任何位置 这些术语可以是完整的单词或单词前缀 示例文档 msg 你好 我是一条短信 示例查询字符串 你好消息 你好 和 消息
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • “更新/取消”按钮不会出现在模板字段编辑按钮中

    当您使用 Gridview 的每一行创建编辑按钮时CommandField单击后它会显示更新 取消按钮 以便您可以接受 取消更改 但是 我想要一个带有工具提示文本的编辑按钮 因为CommandField没有工具提示属性 我用过Templat
  • 不建议在 VB.Net 中使用 Mid()、Instr()、LBound()、UBound() 等吗?

    我有 C 背景 但现在主要使用 VB Net 在我看来 上述函数 以及其他函数 例如 UCase LCase 等是 VB6 及之前版本的遗留物 在 VB Net 中使用这些函数是不受欢迎的 还是纯粹取决于个人喜好 我个人的偏好是远离它们 但
  • VB.NET 中的“阴影”与“覆盖”

    这两个关键词有什么意义Shadows http msdn microsoft com en us library 1h3wytf6 aspx and 覆盖 http msdn microsoft com en us library k777
  • 如何在 vb.net 中使用 Stacktrace 返回错误行号

    我正在尝试创建某种错误捕获方法来返回错误行号 当进程中止时 我们会发送一封中止电子邮件 该电子邮件为我们提供了错误号 and 错误描述但我想知道实际上哪里出了错误 我知道你可以执行以下操作 1 code here 2 code here 3
  • Visual Studio 多个启动项目之间存在延迟?

    如何在解决方案中的启动项目之间添加一些延迟 我希望客户端项目在启动 WindowsService 后 2 3 秒后启动 为什么我需要这个 WindowsService运行socket服务器 Client运行socket来连接服务器 Wind
  • 去除字符串的最佳方法是什么?

    我需要具有最佳性能的想法来删除 过滤字符串 I have string Input view 512 3 159 删除 view 和 的最佳性能方法是什么 和引号 我可以做这个 Input Input Replace view Replac
  • 使用 VB.NET 检查 Word 文档中的字体样式

    我想使用vb net检查一个word文件 并检查文档中的样式是否正确 我必须在word文档中检查这些表达式 a Verdana 16 pt Bold Red b Verdana 12 pt Bold Italic Blue c Verdan
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • Java ByteBuffer 性能问题

    在处理多个千兆字节文件时 我注意到一些奇怪的事情 似乎使用文件通道从文件读取到使用 allocateDirect 分配的重用 ByteBuffer 对象比从 MappedByteBuffer 读取要慢得多 事实上它甚至比读取到字节还要慢使用
  • 这个 cProfile 结果告诉我需要修复什么?

    我想提高Python脚本的性能并且一直在使用cProfile生成性能报告 python m cProfile o chrX prof bgchr py args 我打开这个chrX prof使用 Python 的文件pstats并打印出统计
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • 某些笔记本电脑中的 VB.net Forms UI 显示问题

    我是 VB 应用程序的新手 无法弄清楚我的应用程序出了什么问题 有一个带有几个标签和文本字段的表单 当我在我和其他人的机器上运行该应用程序时 它显示良好 并具有正确的对齐和字体 然而 对于某些人来说 应用程序表单 UI 是破碎的 未对齐的文
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a

随机推荐

  • ADO.NET |数据目录|这是在哪里记录的?

    在 AppConfig 中可以使用 DataDirectory 但我找不到任何文档 DataDirectory 是一个替换字符串 因此您可以单独配置数据库文件的位置 所以而不是 SqlConnection c new SqlConnecti
  • 使用 Z 顺序和位置在 MS Access 中组织打开的表单

    对于 MS Access 2010 我需要一种方法来在打开十几个表单时灵活地维护位置和 Z 顺序 父窗体可以有多个实例 每个实例都可以导致子窗体的多个实例 某些背景在这里 https stackoverflow com q 22108012
  • 为什么 Inspect.exe 在调试中运行时不显示 AutomationId 和其他 UIAutomation 属性?

    我一直在使用 Windows SDK 中的 Inspect exe 来检查 WinForms 应用程序的属性 但注意到在从 Visual Studio 运行应用程序时我没有看到任何属性 例如 AutomationId 按 F5 运行 但是
  • JComponent.paintImmediately() 在 Java Swing 中如何工作?

    我的理解 与 Swing 中的大多数组件 操作不同 对 JComponent repaint 的调用是线程安全的 即虽然重绘请求是从另一个线程 即不是从 EDT 发出的 但实际绘制仅发生在 EDT 中 下面的代码片段演示了这一点 publi
  • 处理分部类、继承和 Visual Studio 生成代码时,通用接口方法应放在哪里

    考虑这种情况 我们有两个由 Visual Studio 生成的类 例如类型化数据集行 这些类派生自我们无法更改的公共基类 我们无法更改这些子类派生的类 但它们是作为部分类生成的 因此我们可以扩展它们 现在我们决定为这两个类实现一个接口 其中
  • 检测用户何时截屏

    我正在寻找一种方法 让我的应用程序在用户截取屏幕截图时收到通知Command Shift 3 or Command Shift 4 一个例子是 Droplr 和 Cloud App 等应用程序 它们会自动上传截取的屏幕截图 我一直在四处寻找
  • 以编程方式设置自定义 UITabBarItem?

    在 iOS 中 TabBarController 中的 TabBar 属性是只读的 如何将自定义项目与特定视图控制器关联 如何访问 tabBar 内的 UITabBarItems 像这样 CustomView custom CustomVi
  • 如何在 R 中将因子格式转换为数字格式而不更改值? [复制]

    这个问题在这里已经有答案了 下面是数据帧 df1 我想将其中的 V2 列从因子格式转换为数字 而不更改当前值 0 0 8 5 3 df1 V1 V2 V3 X2 X3 4470 2010 03 28 0 A 21 53675 0 4471
  • 用于逐步删除随机项的首选 Scala 集合?

    我有一个需要多次迭代的算法 每次迭代都会对集合中的项目进行评分并删除得分最高的项目 我可以填充一个Vector与初始种群一起 不断将其替换为var 或者选择一个可变集合作为val 哪个可变集合最符合要求 你可以考虑一个DoubleLinke
  • 获取控制器内的环境

    我的一个控制器中有一种情况 只能通过 AJAX 访问 我有以下代码 if request gt isXmlHttpRequest response new Response response gt setContent AJAX reque
  • 如何隐藏UINavigationBar 1px底线

    我有一个应用程序 有时需要其导航栏才能与内容融为一体 有谁知道如何摆脱或改变这个烦人的小条的颜色 在下图中我遇到的情况 我正在谈论 根视图控制器 下方的这条 1px 高度线 对于 iOS 13 Use the shadowColor htt
  • 一次查找多个地方的纬度和经度

    我有一长串城镇和城市列表 我想为每个城镇添加纬度和经度信息 有谁知道一次生成此信息的最简单方法 也可以看看对多个地址进行地理编码 https stackoverflow com questions 396819 geocode multip
  • 使用scale_fill_binned()时如何使用特定的填充颜色?

    我想使用我自己的填充颜色 例如 c red blue grey50 black 使用函数时scale fill binned 在 ggplot 代码中 我怎样才能做到这一点 这是一个最小的可重现示例 library tidyverse da
  • 接受可变数量参数的函数

    在本文档中 https developer apple com library prerelease ios documentation Swift Conceptual Swift Programming Language GuidedT
  • 我可以用 AngularJS 更改 Accept-Language 请求标头吗

    有没有办法更改或编辑我发送到 API 的接受语言标头 javascript Jquery 或 Angular 有没有办法 我不想发送默认的 而是发送我的 Cookie 的 在 AngularJS 中 您可以使用以下方法设置通用标头 http
  • 如何访问 Gradle 使用的“java.home”?

    gradlew properties显示没有具有以下值的属性 JAVA HOME 并且以下发出错误 指示不存在此类属性 println org gradle java home println gradle java home printl
  • 在 Google Chrome 扩展中使用 jQuery.ajax

    我使用 jquery ajax 函数将数据从 google chrome 扩展发布到我的网络服务 代码如下 ajax type POST url serviceUrl data data success function msg if ty
  • 将季度/年份格式转换为日期

    我创建了一个函数 将季度年格式的向量强制转换为日期向量 quarter to date c Q1 13 Q2 14 1 2013 03 01 2014 06 01 这是我的函数的代码 quarter to date lt function
  • 用鼠标拖动滚动

    我正在尝试制作一个可滚动面板 但没有滚动条 并通过用鼠标垂直拖动来滚动 这是到目前为止有人帮助我做的 private void panel1 MouseEnter object sender EventArgs e panel1 AutoS
  • 哪个更快? ByVal 还是 ByRef?

    在 VB NET 中 使用方法参数速度更快 ByVal or ByRef 另外 哪个在运行时消耗更多资源 RAM 我通读了这个问题 https stackoverflow com questions 290189 best practice