Mig*_*elo 5 .net c# reflection
我想将自定义数据与Type相关联,并在运行时以极快的速度检索该数据.
这只是我的想象,是我完美的世界:
var myInfo = typeof(MyClass).GetMyInformation();
这会非常快......当然这不存在!如果它确实我不会问.呵呵 ;)
这是使用自定义属性的方式:
var myInfo = typeof(MyClass).GetCustomAttribute("MyInformation");
这很慢,因为它需要查找字符串"MyInformation"
这是一种使用Dictionary <Type,MyInformation>的方法:
var myInfo = myInformationDictionary [typeof(MyClass)];
这也很慢,因为它仍然是'typeof(MyClass)'的查找.
我知道字典非常快,但这还不够......它没有调用方法那么快.它甚至不是相同的速度顺序.
我不是说我希望它像方法调用一样快.我想将信息与类型相关联,并尽快访问它.我在问是否有更好的方法,或事件是最好的方式.
有任何想法吗??
谢谢!
编辑:
我之前在所有片段中提到的typeof(MyClass)都是实际可变的...我不知道它是一个特定的MyClass类型,它可以是任何类型:
输入myType = typeFromSomewhere;
也就是说,在这种情况下,MyClass只是说这个类是由我制作的,而且任何其他可能出现这种情况的类型也是由我制作的...所以它读取
typeof(我自己的一个类,我不知道女巫一个是它,但它肯定是我的)
编辑:结论
与字典相关的一些性能结果:
Dic.buckets | Dic.Count | Dic.Key | Ops(x17)/s | Avg.Time | Min.Time | Max.Time
-----------------------------------------------------------------------------
17519 | 12467 | Type | 1051538 | 0.95?s | 0.86?s | 0.42ms
919 | 912 | Type | 814862 | 1.23?s | 1.14?s | 0.46ms
1162687 | 912 | Type | 1126382 | 0.89?s | 0.81?s | 0.33ms
919 | 912 | Type | 806992 | 1.24?s | 1.16?s | 0.21ms
17 | 17 | Type | 872485 | 1.15?s | 1.06?s | 0.31ms
-----------------------------------------------------------------------------
36353 | 18160 | String | 227520 | 4.40?s | 3.98?s | 0.47ms
919 | 911 | String | 219159 | 4.57?s | 4.14?s | 0.29ms
1162687 | 911 | String | 236384 | 4.23?s | 3.82?s | 0.41ms
919 | 911 | String | 223042 | 4.49?s | 4.10?s | 0.43ms
17 | 17 | String | 229985 | 4.35?s | 3.94?s | 0.28ms
Run Code Online (Sandbox Code Playgroud)
接口调用:
ops(x17)/s: 2896001
Average: 0.35?s
Min: 0.34?s
Max: 1.20?s
Run Code Online (Sandbox Code Playgroud)
虚拟电话:
ops(x17)/s: 3115254
Average: 0.32?s
Min: 0.32?s
Max: 0.65?s
Run Code Online (Sandbox Code Playgroud)
我看到我的字典估计不足!=)
似乎Dictionary of Type到任何东西比虚拟方法调用慢3到4倍.
使用字符串字典不是这种情况.那些比虚拟方法调用慢10到12倍.
所以我告诉我错了!
而且,不,我不是一个导弹!有人在评论中假设这个=)
谢谢大家.
它不仅仅是你的"完美世界",它也是C#!您可以使用扩展方法精确地制作您建议的工作:
var myInfo = typeof(MyClass).GetMyInformation();
Run Code Online (Sandbox Code Playgroud)
在静态TypeUtilities类等中,您将定义以下内容:
public static InfoType GetMyInformation(this Type type)
{
// Return InfoType object.
}
Run Code Online (Sandbox Code Playgroud)
至于你如何实际返回关于类型的信息,可以用多种方式完成.一个简单的if-block,一个静态的Dictionary,给定类型的反射(使用属性/方法),甚至是其他类型.最好的方法在很大程度上取决于上下文和您的特定使用场景.
| 归档时间: |
|
| 查看次数: |
322 次 |
| 最近记录: |