2012-02-21 7 views
2

Я использую SubSonic 2 в течение ~ 5 лет и любил его. Однако в течение последних шести месяцев я играл с идеей перехода либо в SubSonic 3, либо в аналогичный инструмент ORM. Поскольку моя компания использует множество инструментов Telerik, я подумал, что попробую OpenAccess. После того, как он настроен, я решил, что я попытаюсь выполнить чрезвычайно основную задачу по загрузке RadGrid с информацией из таблицы наших пользователей (~ 30 записей).Telerik OpenAccess против SubSonic в простом тесте скорости (не «что лучше»)

Таким образом, в случае OnNeedDataSource сетке, я иметь следующее:

var start = System.Environment.TickCount; 
context = new EntitiesModel(); 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

После построения, что и запуск страницы, он плюет назад, что потребовалось 1607 мс. Однако после обновления страницы она возвращается 0 секунд. (Почему?)

Затем я положил в дозвуковой код:

var start = System.Environment.TickCount; 
rgUsers.DataSource = new UserCollection().Load(); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

я запускаю код в первый раз, и он говорит, что потребовалось 171 мс. После обновления страницы, она сообщает, что она заняла 60-70 мс.

Итак, мой вопрос: Почему OA занимает значительно больше времени для загрузки при первом посещении, но нулевые секунды для загрузки на каждую страницу обновления? В то время как SubSonic значительно быстрее при первом посещении, но занимает ~ 65 мс на каждом обновлении страницы?

Приносим извинения, если это «основной» вопрос или если я недостаточно тестирую производительность. Если есть способ улучшить этот метод, я бы очень признателен за любые советы.

Спасибо, Andrew

ответ

4

OpenAccess имеет внутренний объект базы данных, который создается в первый раз, вы создаете OpenAcccessContext. Он в основном вычисляет все значения по умолчанию, создает кеши, инициализирует другие объекты инфраструктуры и т. Д. Как только он создается, он сохраняется во внутреннем статическом словаре (с ключом connectionID является ключом).

Каждый другой контекст, созданный, будет использовать этот внутренний объект и вообще не будет иметь накладных расходов. При этом говорят, что 1600 мс немного выше, вы можете рассмотреть возможность изменения типа отображения (xml является оптимальным, с точки зрения производительности).

Оптимизация должна заключаться в том, чтобы убедиться, что модель инициализирована в обработчике запуска приложения. Следующий код должен сделать трюк.

void Application_Start(object sender, EventArgs e) 
{ 
    var modelInfo = new EntitiesModel().Metadata; 
} 

РЕДАКТИРОВАТЬ: В качестве продолжения он говорит, что 0 мс, и это фактически не время выполнения запроса. Возврат запроса - это IQueryable, который позже выполняется. Вы должны вызвать ToList(), чтобы получить реальные данные.

+0

спасибо. В этом есть смысл. Я сделал так, как вы сказали, и первый груз упал до 900 мс. – ajtatum

1

Причиной может быть то, что открытие базы данных в OpenACCESS занимает больше времени, чем в SubSonic. Попробуйте выполнить тривиальную операцию, например, получить счетчик, чтобы открыть базу данных, прежде чем измерять время загрузки. Сделайте то же самое в SubSonic.

context = new EntitiesModel(); 
context.Users.Count(); 
var start = System.Environment.TickCount; 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

Томас

0

Не знаю, если это не по теме, но я использовал и вносил вклад в SS2 и SS3 за последние несколько лет. Я только что завершил капитальный ремонт и добавил MsAccessProvider к SS2, а генераторы Enum - к SS2 и SS3 (они зафиксированы и живут на странице проекта).

Я также создал свою собственную структуру кэширования для SS3, которая позволяет автоматическое выборочное кэширование данных (как общих словарей) из таблиц в базе данных, на которые ссылается любой уникальный индекс. Я смог кэшировать данные поиска для создания основанных на шаблонах веб-страниц и улучшить ответ примерно через 2 минуты с поиском SS3 LINQ до доли секунды. (Я не публиковал это публично)

Я просто не знаю, где разместить этот материал, чтобы привлечь внимание пользователей SS. Мои фиксации источника и закрытие открытых выпусков вызвали точно нулевой ответ.

+0

Я хотел бы узнать больше. Какое у вас имя пользователя в github или как я могу связаться с вами? – ajtatum

+0

Я 6pac. Вы можете видеть коммиты и комментарии к источникам SubSonic GitHub. (извините за задержку - по праздникам в течение недели) –

+0

Статья в блоге здесь: http://low-bandwidth.blogspot.com.au/2012/10/automated-foreign-key-list-generation.html –

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

  • Нет связанных вопросов^_^