已对象在VB2010年接受同样的优化动态在C#4.0?
-
26-09-2019 - |
题
有些人认为,C#4.0特征引的 dynamic
关键词是一样的"一切都是一个对象"功能的VB。然而,任何呼吁一个动态的变量将被翻译成委托一旦和从此以后,委派会被称为。在VB,当使用 Object
, 的,没有缓存应用和每个呼吁不归类方法涉及到一大堆的引擎罩下的反映,有时候总额高达400倍的性能损失。
有的 动态型的委托优化和缓存 也已经添加到VB类型方法的呼吁,或者是VB的类型对象仍然如此缓慢?
解决方案
解决方案
一些研究和一个更好的阅读的 前面提到的文章 提到汉斯*顺便带来了有关以下结论:
- VB.NET 2010年支持德国航天中心;
- 你可以实现
IDynamicMetaObjectProvider
如果你想要明确支助的动力,VB.NET 编译是更新认识到这一点; - VB的
Object
将只会使用的德国航空航天中心和方法缓存,如果对象实现了IDynamicMetaObjectProvider
; - BCL和框架的类型没有实现
IDynamicMetaObjectProvider
, 使用Object
在这种类型或者你自己的类型将调用的典型的、非缓存VB.NET 晚-粘合剂。
背景:拟订关于为什么迟到结合高速缓存能帮助VB代码表现
一些人(其中Hans顺便,见他的回答)可能想知道为什么缓存或非缓存在延迟结合可能的问题。实际上,它使得一个大的差别,无论是在VB和其他迟到结合技术(记得 IQueryInterface
COM?).
迟到结合下来到一个简单的原则:给予一个名称及其参数的声明,通过循环的所有方法的这类及其父类装置的方法可用,虽然的 Type
接口(和在VB、方法、财产和一领域可以 看看 同样的,使得这个过程速度较慢).如果你考虑的方法表是无序的,那么这就是轻易得多的价格比一个单一的直接(即,型)方法的呼吁。
如果你能找方法的一次,然后储存的方法指在一个查询表,这将大大加快这一进程。缓存的方法结合在德国航天中心进一步骤进一步的和替代的方法-打电话与一个指向实际的方法,如果可能的话。之后的第一个电话,这将成为一个数量级以更快的每个后续呼吁(认为200x到800x倍).
作为一个例子的时候这个问题,这里的一些代码说明了这个问题。在一个情况下,每一类有一个 .Name
串的财产,但该类不共享一个共同的祖先或接口,可以天真地排列出任何这些类型如下所示:
' 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
这个代码(类似的至少)实际上使它成为生产与我的一个客户,并使用一个经常被称为阿贾克斯回调。没有手动缓存 .Name
属性,已经在中小型列出的不到一半,一百万对象,迟到结合代码成为这样一个明显的负担,最终会带来的整个网站了。事实证明这难以追踪这一问题,但这是一个故事的另一个时间。后定本,该网站重新获得95%的其CPU的资源.
因此,这个问题的答案汉斯的问题 "不,你有更大的问题,不用担心" 是简单的:这是一个很大的问题(或可能),esp.VB程序员,他们已经太粗心大意的关于使用晚有约束力。
在这种特定情况下,许多喜欢他们,VB.NET 2010年显然已经不直升级引入后期结合,正因为如此, Object
仍然是邪恶的不知道且不应与 dynamic
.
PS:迟到结合性能的问题非常难以追踪,除非你有一个很好的性能分析器并知道如何迟到结合是实现在内部通过的编译器。