walterlv / BlogComments

3 stars 0 forks source link

post/dotnet-high-performance-reflection-suggestions #10

Open utterances-bot opened 5 years ago

utterances-bot commented 5 years ago

.NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法) - walterlv

.NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html

huoyaoyuan commented 5 years ago

这里的CachedExpression方法里包含了一个对于cache是否为null的判断,对性能是有影响的。正确做法应该是在GlobalSetup里面初始化好cache,对应于一般在Factory的ctor或者cctor里初始化的做法。

walterlv commented 5 years ago

@huoyaoyuan 一开始初始化好的话,对启动性能也有影响。取决于业务,找平衡点。判空代码通常不是性能瓶颈,除非此处代码调用极度频繁。如果反射是大量重复则一开始初始化好。

huoyaoyuan commented 5 years ago

原本在上面所有图中看起来都没有时间的 newLambda 竟然差异如此巨大;不过,这都是千分之一纳秒级别了;如果你创建的类数量不是百万级别以上,你还真的可以忽略。

这一语境很偏向于大量重复了,和预初始化搭配比较恰当一些

walterlv commented 5 years ago

@huoyaoyuan 你说的没错,都到 new 空对象这一级别了,判空确实就可能是瓶颈代码了。

myloadwls commented 5 years ago

我有一个问题:typeof在创建Type时,Net内部会做缓存吗?当我第二次调用同样类型的typeof的时候是使用的缓存还是从新生成一个Type?

myloadwls commented 5 years ago

我做了一个压力测试,发现缓存typeof的结果和每次调用typeof的结果相差不大,似乎.Net内部做了缓存,但我没有找到相关的资料有点疑惑。