2010-09-07 4 views
1

Я искал объект форматирования и templater.Formatter, который генерирует код IL для String.Format

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

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

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

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

ответ

1

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

Instance типа Student: Name = Джон, [email protected] и дата рождения = 3/20/1 983 12:00:00 AM Instance типа Student: Name = Джон, [email protected] и дата рождения = 3/20/1 983 12:00:00 AM HenriFormat: Среднее время выполнения для +500000 пробегов = 00: 00: 00.0000045 StructureToString: среднее время работы за 500000 пробегов = 00: 00: 00.0000003

Смежные вопросы