Mat*_*wan 3 .net c# optimization
基本上,这个代码段是:
// Get these once, create list, re-use same list
var 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));
}
}
Run Code Online (Sandbox Code Playgroud)
比这更快:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
...?
我的想法是,对于第二个块,每个循环将执行再次检查对象的工作,而第一个将具有将在每个循环中持续存在的列表.
与线路类似
var prodType = products.GetType();
Run Code Online (Sandbox Code Playgroud)
该类型只会被检索一次.
或者编译器/ .Net只是在第二个例子中重复使用相同的列表,而我不必做任何事情?如何将创建新列表的开销与重复获取对象属性进行比较?垃圾收集器是否会以不同的方式处理我创建的列表,导致它更长时间挂起?
任何答案或指向正确的方向非常感谢.
或者编译器/ .Net只是在第二个例子中重复使用相同的列表,而我不必做任何事情?
如果它知道Reflection API是幂等的,并且结果对象是观察纯的,它就可以做到.它不知道.此优化将无法完成.调用任何Reflection API都可以在理论上打印到控制台.JIT必须执行调用才能确定.
事实上,即使这样,它也不是一个安全的优化,因为Reflection API可能会抛出,只有在外部循环至少执行一次迭代时才会引发该异常.
是的,将列表分解将导致性能提升.
如何将创建新列表的开销与重复获取对象属性进行比较?
不确定你的意思.测量.
垃圾收集器是否会以不同的方式处理我创建的列表,导致它更长时间挂起?
这对GC没有影响,因为属性列表很小(可能是几百个字节,具体取决于属性的数量).
将链表分解出来会导致该列表保持活动一段时间,因为列表将保持活动状态,直到外部循环完成(至少在CLR的当前实现中).
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |