C# 为String.Format生成IL代码的格式化程序

C# 为String.Format生成IL代码的格式化程序,c#,templates,reflection,reflection.emit,C#,Templates,Reflection,Reflection.emit,我正在寻找一个对象格式化程序和模板 我查看了HenriFormatter,当检查性能时发现,对于相同的对象类型,第一次调用的时间比下一次调用的时间多15倍-15k,第二次大约是1k。我变成了digg,发现它使用的是DataBinder.Eval,它使用的是反射,在某种程度上看起来类型结构是缓存 与相同的字符串.格式相比,大约为50-100个刻度 所以我想知道,如果我们不使用DataBinder.Eval,而是可以发出String.Format代码并对其进行缓存,从而获得8倍的性能呢。但在做所有

我正在寻找一个对象格式化程序和模板

我查看了HenriFormatter,当检查性能时发现,对于相同的对象类型,第一次调用的时间比下一次调用的时间多15倍-15k,第二次大约是1k。我变成了digg,发现它使用的是DataBinder.Eval,它使用的是反射,在某种程度上看起来类型结构是缓存

与相同的字符串.格式相比,大约为50-100个刻度


所以我想知道,如果我们不使用DataBinder.Eval,而是可以发出String.Format代码并对其进行缓存,从而获得8倍的性能呢。但在做所有这些之前,我感兴趣的是是否已经在任何地方做了一些事情。

好的,您可以分析格式字符串并编写结果字符串。使用表达式树进行格式调用。为了进行测试,我基于Scott Hanselmann的解析例程(为了简单起见,删除了自定义格式功能)实现了POC。与HenryFormatter相比,我的加工结果如下:

学生类型的实例:Name=John, 电子邮件=john@roffle.edu及 出生日期=1984年3月20日凌晨12:00:00 学生类型的实例:Name=John, 电子邮件=john@roffle.edu及 出生日期=1984年3月20日凌晨12:00:00 HenriFormat:的平均运行时间 500000次运行=00:00:00.0000045 StructureToString:平均运行时间 500000次运行=00:00:00.0000003


您可以分析格式字符串并使用表达式树编写结果字符串.format调用。为了进行测试,我基于Scott Hanselmann的解析例程(为了简单起见,删除了自定义格式功能)实现了POC。与HenryFormatter相比,我的加工结果如下:

学生类型的实例:Name=John, 电子邮件=john@roffle.edu及 出生日期=1984年3月20日凌晨12:00:00 学生类型的实例:Name=John, 电子邮件=john@roffle.edu及 出生日期=1984年3月20日凌晨12:00:00 HenriFormat:的平均运行时间 500000次运行=00:00:00.0000045 StructureToString:平均运行时间 500000次运行=00:00:00.0000003