Grz*_*nio 15 .net c# optimization performance
我正在优化我的代码,我注意到使用属性(甚至是自动属性)会对执行时间产生深远的影响.请参阅以下示例:
[Test]
public void GetterVsField()
{
PropertyTest propertyTest = new PropertyTest();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
propertyTest.LoopUsingCopy();
Console.WriteLine("Using copy: " + stopwatch.ElapsedMilliseconds / 1000.0);
stopwatch.Restart();
propertyTest.LoopUsingGetter();
Console.WriteLine("Using getter: " + stopwatch.ElapsedMilliseconds / 1000.0);
stopwatch.Restart();
propertyTest.LoopUsingField();
Console.WriteLine("Using field: " + stopwatch.ElapsedMilliseconds / 1000.0);
}
public class PropertyTest
{
public PropertyTest()
{
NumRepet = 100000000;
_numRepet = NumRepet;
}
int NumRepet { get; set; }
private int _numRepet;
public int LoopUsingGetter()
{
int dummy = 314;
for (int i = 0; i < NumRepet; i++)
{
dummy++;
}
return dummy;
}
public int LoopUsingCopy()
{
int numRepetCopy = NumRepet;
int dummy = 314;
for (int i = 0; i < numRepetCopy; i++)
{
dummy++;
}
return dummy;
}
public int LoopUsingField()
{
int dummy = 314;
for (int i = 0; i < _numRepet; i++)
{
dummy++;
}
return dummy;
}
}
Run Code Online (Sandbox Code Playgroud)
在Release
我的机器模式中,我得到:
Using copy: 0.029
Using getter: 0.054
Using field: 0.026
Run Code Online (Sandbox Code Playgroud)
在我的情况下是一个灾难 - 如果我想获得最大的性能,最关键的循环就不能使用任何属性.
我在这做错了什么?我以为这些都是inlined
由JIT optimizer
.
Aik*_*Aik -1
您必须检查优化代码复选框是否已选中。
X64 JIT 编译器中对 inlinig 有更多限制。有关 JIT64 内联优化的更多信息如下: David Broman 的 CLR Profiling API 博客:Tail call JIT Conditions。
请看点#3 The caller or callee return a value type
。如果您的属性将返回引用类型,则属性 getter 将被内联。这意味着该属性int NumRepet { get; set; }
未内联,但object NumRepet { get; set; }
如果您不违反其他限制,该属性将会内联。
X64 JIT 的优化很差,这就是为什么会像 John 提到的那样引入新的
归档时间: |
|
查看次数: |
715 次 |
最近记录: |