VB 2010 中的对象是否获得了与 C# 4.0 中的动态相同的优化?

2024-03-14

有些人认为 C# 4.0 引入的功能dynamic关键字与VB的“一切都是对象”特性相同。但是,对动态变量的任何调用都将被转换为委托一次,从那时起,将调用该委托。在VB中,当使用Object,不应用缓存,并且对非类型化方法的每次调用都涉及大量的底层反射,有时总计会造成高达 400 倍的性能损失。

动态类型委托优化和缓存 http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/也被添加到VB的无类型方法调用中,还是VB的无类型对象还这么慢?


Solution

一些研究和更好的阅读之前提到的文章 http://msdn.microsoft.com/en-us/magazine/ee336123.aspx汉斯·帕桑特(Hans Passant)提到,得出以下结论:

  • VB.NET 2010支持DLR;
  • 你可以实施IDynamicMetaObjectProvider如果您想显式支持动态,则更新 VB.NET 编译器以识别这一点;
  • VB's Object仅当对象实现时才使用 DLR 和方法缓存IDynamicMetaObjectProvider;
  • BCL 和 Framework 类型未实现IDynamicMetaObjectProvider, using Object在此类类型或您自己的类型上将调用经典的、非缓存的 VB.NET 后期绑定器。

背景:详细阐述为什么后期绑定缓存可以提高 VB 代码性能

有些人(其中包括 Hans Passant,请参阅他的答案)可能想知道为什么后期绑定中的缓存或非缓存可能很重要。实际上,无论是在 VB 中还是在其他后期绑定技术中,它都有很大的不同(记住IQueryInterface与 COM?)。

后期绑定归结为一个简单的原则:给定名称及其参数声明,通过可用的方法循环遍历此类及其父类的所有方法Type接口(在 VB 中,方法、属性和字段可以look同样的,使这个过程更慢)。如果您认为方法表是无序的,那么这很容易比单个直接(即类型化)方法调用昂贵得多。

如果您能够查找该方法一次,然后将方法指针存储在查找表中,这将大大加快此过程。 DLR 中的缓存方法绑定更进一步,如果可能的话,用指向实际方法的指针替换方法调用。第一次调用后,后续每次调用的速度都会快一个数量级(想想快 200 倍到 800 倍)。

作为何时重要的示例,下面是一些说明此问题的代码。如果每个班级都有一个.Namestring 属性,但这些类不共享共同的祖先或接口,您可以天真地对任何这些类型的列表进行排序,如下所示:

' in the body of some method '
List<Customers> listCustomers = GetListCustomers()
List<Companies> listCompanies = GetListCompanies()

listCustomers.Sort(MySort.SortByName)
listCompanies.Sort(MySort.SortByName)

' sorting function '
Public Shared Function SortByName(Object obj1, Object obj2) As Integer
    ' for clarity, check for equality and for nothingness removed '    
    return String.Compare(obj1.Name, obj2.Name)    
End Function

这段代码(至少类似)实际上已与我的一个客户一起投入生产,并在通常称为 AJAX 回调的过程中使用。无需手动缓存.Name属性,已经在不到 50 万个对象的中等规模列表中,后期绑定代码成为如此明显的负担,最终导致整个站点瘫痪。事实证明很难找到这个问题,但这是另一个故事了。修复此问题后,该站点恢复了 95% 的 CPU 资源。

那么,汉斯问题的答案“你没有更大的问题要担心吗”很简单:这是一个大问题(或者可能是),尤其是。对于对使用后期绑定过于粗心的 VB 程序员来说。

在这种特殊情况下,以及许多类似的情况,VB.NET 2010 显然没有升级以引入后期绑定,因此,Object对于不知情的人来说仍然是邪恶的,不应该与dynamic.

PS:后期绑定性能问题很难追踪,除非您有良好的性能分析器并且知道编译器内部如何实现后期绑定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB 2010 中的对象是否获得了与 C# 4.0 中的动态相同的优化? 的相关文章

  • SQL存储过程执行时间差异

    我在 win form 应用程序中遇到奇怪的问题 我正在调用一个存储过程 并且执行大约需要 6 秒 此存储过程接受多个参数 包括一个输出参数 从应用程序级别我使用 Dim dt1 DateTime Now cmd ExecuteNonQue
  • 通过名称访问表单的控件

    不确定这篇文章的标题是否准确 我试图通过在循环中 组合 它们的名称来访问 Windows 窗体控件及其属性 但我似乎找不到相关文档 使用VB net 基本上 假设我有以下内容 Dim myDt As New DataTable Dim ro
  • 我是唯一一个收到“当前目标框架中不可用的程序集”的人吗?

    在添加测试项目后 我在使用 Visual Studio 2010 和任何报告此错误的框架版本时遇到了一个持续存在的问题 当前目标框架中不提供程序集 到目前为止 我只在两个程序集上发生过这种情况 并且始终一致 系统服务流程 系统 配置 安装
  • 使用 Group By LINQ 语句时 VB.NET 返回 IEnumerable(Of IEnumerable(Of T))

    我正在尝试转换安西姆 凯拉德INotifyDataErrorInfo执行 http burnaftercoding com post asynchronous validation with wpf 4 5 进入VB NET 一切顺利 直到
  • SvcUtil.exe 与添加引用

    当 VS NET 中的 添加服务引用 提供了您需要的所有代理类时 为什么有人会使用 SvcUtil exe 有时在 VS 中添加服务引用无法创建有用的代理 相反 它为您提供了一个空的 Reference cs 详细信息here https
  • Visual Studio 2010 - 在调试期间查看列表导致超时

    我正在尝试调试一个项目 突然遇到一个问题 如果我尝试查看它 枚举任何对象集合都会导致超时 如果我正常运行该程序 就没有问题 如果我尝试查看任何集合 例如列表 我会收到超时错误 整个事情就会崩溃 我认为我的一个更复杂的集合可能出了问题 所以我
  • Mercurial 与 Visual Studio 2010 的白痴清单

    所以我是一个源代码控制白痴 所以请用这个清单来幽默我 我最终决定使用Mercurial TortoiseHg VS2010 HgScc包 http bitbucket org zzsergant hgsccpackage wiki Home
  • Visual Studio 参考在多项目环境中未被复制

    我在 VS 2010 中有一个解决方案文件 其中有多个项目 现在 我有一个对该 dll 调用 MySql Data Entity dll 的引用 例如 我在解决方案中设置了以下项目 域 引用MySql Data Entity dll Dom
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • 如何让 Debug.WriteLine 与其他进程一起工作?

    我有一个程序可以使用以下命令生成另外两个进程System Diagnostics Process 他们的输出被第一个程序捕获 players p Key StartInfo new ProcessStartInfo FileName arg
  • 创建 Visual Studio 风格的选项/设置对话框

    我目前正在改进 winforms 应用程序的选项对话框 目前我正在使用选项卡控件 我想为类似于 Visual Studio 的设置创建一个表单 对话框 这是怎么做到的 我可以在左侧看到类似树视图的控件 但是他们使用什么控件来显示每个选项页面
  • 编译 GLUI 库,VS2010 给我一个奇怪的命名空间错误

    我有一个针对我所在班级的 OpenGL 项目 它基于 GLUI 提供的 GLUI 库无法工作 这就是我尝试自己编译它的原因 因此 我从 SourceForge 下载了源代码并尝试编译 glui 库 它给了我这个 但我找不到任何相关信息 1
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • 运行 MVC3 应用程序时出错

    我有 Visual Studio 2010 最近我在使用MVC2 由于某种原因我在我的计算机上安装了MVC3 一切都运转良好 直到今天 Now when I am creating new project I am getting belo
  • String.Format - 它如何工作以及如何实现自定义格式字符串

    With String Format 例如可以格式化DateTime对象以许多不同的方式 每次我寻找所需的格式时 我都需要在互联网上搜索 我几乎总能找到一个可以使用的例子 例如 String Format 0 MM dd yyyy Date
  • 根据值从绿色到红色[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个在 vb net 中返回从红色 值 0 到绿色 值 100 的颜色的函数 另外 我需要一种方法来确定字体的颜色应该是白色还是
  • 将包含驱动器号的相对路径转换为 ​​.NET 文件函数的绝对路径

    如何转换驱动器相对路径 例如D test xml进入绝对路径 例如函数XDocument Load 会接受 D盘可能有D data作为其当前工作目录 例如 soD test xml意思是D data test xml 我已经尝试过这样的混合
  • 检查 listbox1 中是否已存在某个项目

    在 form1 中 我有两个列表框 listbox1 listbox2 加载按钮和保存按钮 此代码会将 listbox1 selecteditem 写入 txt 文件 然后 loadbutton 将加载信息 但在 listbox2 中我希望
  • 如何使用 VB.NET 或 C#.NET 代码从 yahoo 邮件 ID 发送邮件

    我想从我的 yahoomail Id 发送邮件 如何使用 VB NET 或 C NET 代码从 yahoo mail Id 发送邮件 需要善意的帮助 提前谢谢 西瓦库马尔 以下是一些制作基本 html 电子邮件消息的示例 http help
  • 使用 iTextSharp 生成 QR 条形码

    我有一个值数组 arr 0 Sam arr 1 1452 arr 2 NY 我想用这些值生成 QR 条形码 我们正在使用 ITextSharp 任何帮助将不胜感激 我正在使用vb net 以下是如何使用 iText 创建条形码的一些示例 h

随机推荐

  • 在 codeigniter 中一起更新和连接查询?

    连接两个表时更新数据 但在 where 条件下出现错误 我可以在查询中同时使用连接和更新吗 这是我的代码 public function update model id array data textArea data textdata t
  • 在 C 中访问 ELF 符号表

    我正在编写一个程序来模仿elfdump ecps 目前它可以正确打印 elf 标头 程序标头和节标头 但我陷入了符号表的最后几个部分 所需的输出格式为 Symbol Table Section dynsym index value size
  • 如何显示图片并获取鼠标点击坐标[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否可以在Python Windows 中显示一些图片 然后用鼠标单击该图片并获取该单击相对于图片边缘的坐标 Thanks 是
  • Android 4.0 -> 4.3(包含) - Web 视图页面之间的 Web 存储丢失

    我正在开发一个 Android 项目 该项目依赖于WebView浏览设备上存储的多个 HTML 页面 并在需要将输入存储到数据库时将输入提交到 Web 视图 每个页面都包含与 jQuery 绑定到上一页 下一页的控件 每个页面包含不同类型的
  • Linux Mach-O 反汇编器

    是否有任何 Linux 程序可以像 objdump 一样反汇编 OSX 通用 x86 x86 64 fat Mach O 二进制文件 GNU binutils 的 objdump 支持 ELF 和 Windows PE 文件 但不支持 Ma
  • 什么是对象关系映射框架? [复制]

    这个问题在这里已经有答案了 正如标题所说 什么是 ORM 框架以及它有什么用处 一个简单的答案是 您可以使用编程语言将表或存储过程包装在类中 这样您就可以使用对象的方法和属性 而不是编写 SQL 语句来与数据库交互 换句话说 而不是这样的
  • 如何使用负 z-index 使链接可点击?

    我在用drop down我的标题中的菜单用于通知 但是当下拉打开所有可见的 div 后面时 我给了z index到所有 div 但这些 div 上的链接现在不可点击 下拉 div CSS drop down overflow scroll
  • 未捕获错误:语法错误,无法识别的表达式:悬停

    这是问题的 JSFidle http jsfiddle net LRTh3 36 http jsfiddle net LRTh3 36 div boxes mousedown function event Error on this lin
  • Cognito / S3 用户特定策略

    我使用适用于 Android 的 AWS 开发工具包和 Cognito 对我的 AWS 资源的用户进行身份验证 通过 Amazon 登录 我是什么尝试要做的就是设置一个 S3 存储桶 如下所示 my bucket email protect
  • pydantic 和抽象类的子类

    我正在尝试将 pydantic 与如下所示的架构一起使用 class Base BaseModel ABC common int class Child1 Base child1 int class Child2 Base child2 i
  • Java 中防御性副本的低效[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一名长期 C C 程序员 正在学习 Java 我读过有关通过使用返回对私有字段的引用的访问器方法来破坏封装的问题 标准的Java解决方案似乎
  • 无法删除/取消链接到 python 和 windows 中的目录的符号链接

    edited 我在 Widnows7 上创建了指向目录的符号链接 使用mklink命令行 mklink d books config 我正在尝试使用 python 2 7 删除它 仍在 Windows 上 gt gt gt os remov
  • 在 ASP.NET Web 表单中创建动态 UI

    我需要创建一个调查页面 其中包含从数据库读取的以下结构 Survey QuestionA a Answer1 Radio button b Answer2 Radio button c Answer3 Radio button d Answ
  • 包标识符应该是小写还是驼峰?

    假设我有一个名为 Foo Bar 的应用程序 包标识符应该是com tyilo foobar or com tyilo FooBar 什么是最正常的 苹果是怎么做的 您可以做任何事情 但为了让生活更简单并防止常见错误 将其全部小写更容易 但
  • 在本地计算机上使用 Github 操作秘密 - 可能吗?

    我知道我可以使用curl 来通过curl 列出存储库的秘密 如下所示 curl H Accept application vnd github v3 json H Authorization token personal access to
  • Python 寻找素因数

    两部分问题 试图确定 600851475143 的最大质因数 我在网上发现了这个程序似乎有效 问题是 尽管我了解该程序正在做什么的基础知识 但我很难弄清楚它到底是如何工作的 另外 我希望您能阐明您可能知道的寻找素因数的任何方法 也许无需测试
  • Visual Studio 2010 的 HWnd

    有没有办法从 VSIX 扩展获取指向 Visual Studio 2010 顶部窗口的 HWnd 指针 我想更改窗口的标题 由于您的 VSIX 扩展很可能会与 Visual Studio 一起在进程内运行 因此您应该尝试以下操作 Syste
  • fork:关闭所有打开的套接字

    我在用multiprocessing Pool map 它分叉当前进程 我的理解是 默认情况下 所有文件描述符包括插座分叉时从主进程复制 主进程本身是一个Web服务器 使用cherrypy http cherrypy org 所以这会对开放
  • 需要在 bootstrap css 中单击时将图像加载为模态

    我尝试通过淡入淡出背景来加载模态图像 这个对我有用 但是对于多个图像 如何在不编写多个模态 div 的情况下根据图像 id 加载我单击的图像
  • VB 2010 中的对象是否获得了与 C# 4.0 中的动态相同的优化?

    有些人认为 C 4 0 引入的功能dynamic关键字与VB的 一切都是对象 特性相同 但是 对动态变量的任何调用都将被转换为委托一次 从那时起 将调用该委托 在VB中 当使用Object 不应用缓存 并且对非类型化方法的每次调用都涉及大量