C#Foreach优化与反射

C#Foreach优化与反射,第1张

概述基本上,这个代码段是: // Get these once, create list, re-use same listvar prodType = products.GetType();var fieldInfList = prodType.GetFields();var propInfList = prodType.GetProperties();foreach (var p in 基本上,这个代码段是:

// Get these once,create List,re-use same Listvar prodType = products.GetType();var fIEldInfList = prodType.GetFIElds();var propInfList = prodType.GetPropertIEs();foreach (var p in products){    foreach (var fIEldInf in fIEldInfList)    {        fIEldInf.SetValue(this,fIEldInf.GetValue(p));    }    foreach (var propInf in propInfList)    {        propInf.SetValue(this,propInf.GetValue(p));    }}

比这更快:

foreach (var p in products){    foreach (var fIEldInf in products.GetType().GetFIElds())    {        fIEldInf.SetValue(this,fIEldInf.GetValue(p));    }    foreach (var propInf in products.GetType().GetPropertIEs())    {        propInf.SetValue(this,propInf.GetValue(p));    }}

…?

我的想法是,对于第二个块,每个循环将执行再次检查对象的工作,而第一个将具有将在每个循环中持续存在的列表.

与线路类似

var prodType = products.GetType();

该类型只会被检索一次.

或者编译器/ .Net只是在第二个例子中重复使用相同的列表,而我不必做任何事情?如何将创建新列表的开销与重复获取对象属性进行比较?垃圾收集器是否会以不同的方式处理我创建的列表,导致它更长时间挂起?

任何答案或指向正确的方向非常感谢.

解决方法

Or does the compiler / .Net just re-use the same List in the second example without me having to do anything?

如果它知道Reflection API是幂等的,并且结果对象是观察纯的,它就可以做到.它不知道.此优化将无法完成.调用任何Reflection API都可以在理论上打印到控制台. JIT必须执行调用才能确定.

事实上,即使这样,它也不是一个安全的优化,因为Reflection API可能会抛出,只有在外部循环至少执行一次迭代时才会引发该异常.

是的,将列表分解将导致性能提升.

How do I compare the overhead of creating a new List with getting the object propertIEs repeatedly?

不确定你的意思.测量.

Would the garbage collector treat my created List any differently causing it to hang around longer?

这对GC没有影响,因为属性列表很小(可能是几百个字节,具体取决于属性的数量).

将链表分解出来会导致该列表保持活动一小段时间,因为列表将保持活动状态直到外部循环完成(至少在CLR的当前实现中).

总结

以上是内存溢出为你收集整理的C#Foreach优化与反射全部内容,希望文章能够帮你解决C#Foreach优化与反射所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存