Telerik OpenAccess и SubSonic в простом тесте скорости (а не «что лучше») - PullRequest
2 голосов
/ 22 февраля 2012

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

Итак, внутри события Grid 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 секунд. (Почему?)

Затем я вставил код SubSonic:

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мс.

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

Я прошу прощения, если это "основной" вопрос или я не проверяю производительность должным образом. Если есть какой-либо способ улучшить этот метод, я буду очень признателен за любой совет.

Спасибо, Andrew

Ответы [ 3 ]

4 голосов
/ 22 февраля 2012

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

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

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

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

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

1 голос
/ 22 февраля 2012

Причиной может быть то, что открытие базы данных в 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);

Thomas

0 голосов
/ 02 марта 2012

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

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

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

...