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 中的动态相同的优化? 的相关文章

随机推荐

  • 在 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 不应用缓存 并且对非类型化方法的每次调用都涉及大量