The*_*kle 2 .net c# methods performance func
将实现引用透明方法作为静态只读Func而不是简单地作为方法,是否有任何性能影响?我个人认为Func版本更具可读性,但传统方式可能更有效.
这个:
static readonly Func<DateTime, DateTime> TruncateDay =
date => date.AddHours(-date.Hour)
.AddMinutes(-date.Minute)
.AddSeconds(-date.Second)
.AddMilliseconds(-date.Millisecond);
static readonly Func<DateTime, DateTime> TruncateMonth =
date => TruncateDay(date).AddDays(1 - date.Day);
static readonly Func<DateTime, DateTime> TruncateYear =
date => TruncateMonth(date).AddMonths(1 - date.Month);
static readonly Func<DateTime, int> QuarterSwitch =
date => Switch(date.Month % 3, 0,
Case(1, 3),
Case(2, 4),
Case(0, 5));
Run Code Online (Sandbox Code Playgroud)
对此:
static DateTime TruncateDay (DateTime date)
{
return date.AddHours(-date.Hour)
.AddMinutes(-date.Minute)
.AddSeconds(-date.Second)
.AddMilliseconds(-date.Millisecond);
}
static DateTime TruncateMonth (DateTime date)
{
return TruncateDay(date).AddDays(1 - date.Day);
}
static DateTime TruncateYear (DateTime date)
{
return TruncateMonth(date).AddMonths(1 - date.Month);
}
static int QuarterSwitch (DateTime date)
{
return Switch(date.Month % 3, 0,
Case(1, 3),
Case(2, 4),
Case(0, 5));
}
Run Code Online (Sandbox Code Playgroud)
这些如何代表内部?编译器将每个翻译成什么?
在引擎盖下,编译器为每个Func方法创建2个额外成员:
缓存委托字段的原因是编译器需要这个代码中出现的匿名方法.在这种情况下,编译器不会优化掉字段.
该类还需要一个静态构造函数来为每个方法初始化这两个字段.
一些性能影响是:
Func方法永远不能内联.对于非常小的方法,这可以产生很大的不同.使用它的一些其他缺点是: