Форматер, который генерирует код IL для String.Format - PullRequest
1 голос
/ 07 сентября 2010

Я искал объектный форматировщик и шаблонер.

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

Я заглянул в HenriFormatter и, когда проверил производительность, обнаружил, что для одного и того же объекта первый вызов типа - вызывает в 15 раз больше времени, чем для следующего - 15 000 тактов, второй - около 1 000. Я стал digg, и обнаружил, что он использует DataBinder.Eval, который использует отражение, и на некотором уровне выглядит, как структура типа кэширует.

По сравнению с тем же форматом String.Forum, который составлял около 50-100 тиков.

Так что мне интересно, что если вместо использования DataBinder.Eval, мы можем испустить код Ering String.Format и кешировать его, и получить 8-кратную производительность. Но прежде чем делать все это, мне было интересно, если что-нибудь уже было сделано.

1 Ответ

1 голос
/ 02 октября 2010

хорошо, вы можете анализировать строку формата и составлять строку результата. Форматировать вызов, используя деревья выражений. Для теста я реализовал реализацию POC на основе процедуры синтаксического анализа Скотта Хансельмана (для простоты удалены возможности пользовательского формата): исходный код . По сравнению с HenryFormatter мои результаты обработки были следующими:

Экземпляр типа Студент: Имя = Джон, Email=john@roffle.edu и дата рождения = 3/20/1 983 12:00:00 Экземпляр типа Студент: Имя = Джон, Email=john@roffle.edu и дата рождения = 3/20/1 983 12:00:00 HenriFormat: среднее время выполнения для 500000 пробежек = 00: 00: 00.0000045 StructureToString: среднее время выполнения для 500000 пробежек = 00: 00: 00.000033

...