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

发布于 2024-09-18 13:37:54 字数 517 浏览 5 评论 0原文

我一直在寻找对象格式化程序和模板程序。

http://haacked.com/archive/2009/01/ 14/named-formats-redux.aspx

我研究了 HenriFormatter,当检查性能时发现,对于同一个对象 Type 第一次调用 - 导致比下一个调用多 15 倍的时间 - 15k 刻度,第二次大约 1k。我开始挖掘,发现它使用 DataBinder.Eval,它使用反射,并且在某种程度上看起来像 Type 结构正在缓存。

与相同的 String.Format 相比,大约需要 50-100 个刻度。

所以我想知道,如果我们不使用 DataBinder.Eval,而是可以发出 String.Format 代码并缓存它,并获得 8 倍的性能,会怎么样?但在做这一切之前,我很感兴趣是否已经在任何地方做了一些事情。

I was looking for an object formatter and templater.

http://haacked.com/archive/2009/01/14/named-formats-redux.aspx

I looked into HenriFormatter and when check performance found that for the same object Type first invocation - causes 15x more time than for next - 15k ticks, second was around 1k. I become digg, and found that its using DataBinder.Eval, that uses reflection, and on some level looks like Type structure is caching.

In compare with the same String.Format that was around 50-100 ticks.

So I a wondering, what if instead of using DataBinder.Eval, we can Emit String.Format code and cache it, and get 8 times performance. But before do all this, I was interested if something was already done anywhere.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热血少△年 2024-09-25 13:37:54

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

学生类型的实例:Name=John,
[电子邮件受保护]
出生日期=3/20/1 983 12:00:00 AM
学生类型实例:Name=John,
[电子邮件受保护]
出生日期=3/20/1 983 12:00:00 AM
HenriFormat:平均运行时间
500000 次运行 = 00:00:00.0000045
StructureToString:平均运行时间
500000 次运行 = 00:00:00.0000003

well, you can analyze format string and compose result string.Format call using Expression trees. Just for the test I've made POC implementation it based on Scott Hanselmann's parsing routine (removed custom format capabilities for the simplicity): source code. On my maching results comparing to HenryFormatter were the following:

Instance of Student type : Name=John,
[email protected] and
birthdate=3/20/1 983 12:00:00 AM
Instance of Student type : Name=John,
[email protected] and
birthdate=3/20/1 983 12:00:00 AM
HenriFormat: Average run time for
500000 runs = 00:00:00.0000045
StructureToString: Average run time
for 500000 runs = 00:00:00.0000003

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文