2013-03-23 4 views
18

Недавно я перенес мою модель объекта из ObjectContext с использованием 4.1 в DbContext с использованием 5.0. Я начинаю сожалеть об этом, потому что замечаю очень низкую производительность при использовании DbContext и ObjectContext. Вот сценарий тестирования:DbContext Ошибка выполнения запроса против ObjectContext

Оба контекста используют одну и ту же базу данных с примерно 600 таблицами. LazyLoading и ProxyCreation отключены для обоих (не показаны в примере кода). Оба имеют предварительно созданные представления.

Тест сначала делает 1 вызов для загрузки рабочей области метаданных. Затем в цикле for, который выполняется 100 раз, я обновляю контекст и делаю один вызов, который принимает первый 10. (Я создаю контекст внутри цикла for, потому что это имитирует использование в службе WCF, что создаст контекст каждый раз)

for (int i = 0; i < 100; i++) 
{ 
    using (MyEntities db = new MyEntities()) 
    { 
     var a = db.MyObject.Take(10).ToList(); 
    } 
} 

Когда я запускаю это с ObjectContext, это занимает около 4,5 секунд. Когда я запускаю его с помощью DbContext, это занимает около 17 секунд. Я профилировал это, используя профилировщик производительности RedGate. Для DbContext кажется, что основным виновником является метод UpdateEntitySetMappings. Это вызывается для каждого запроса и, как представляется, извлекает метаданные и просматривает каждый элемент в OSpace. AsNoTracking не помог.

EDIT: Чтобы дать более подробную информацию, проблема связана с созданием \ инициализацией DbSet и ObjectSet, а не с фактическим запросом. Когда я делаю вызов с ObjectContext, для создания ObjectSet требуется в среднем 42 мс. Когда я звоню с DbContext, для создания внутреннего dbset требуется около 140 мс. Оба объекта ObjectSet и DbSet выполняют некоторые сопоставления сопоставления сущностей из метаданных. Я заметил, что DbSet делает это для ВСЕХ типов в рабочей области, а ObjectSet - нет. Я предполагаю (не пробовал), что модель с меньшим количеством таблиц отличается от разницы в производительности.

ответ

2

DbContext - это оболочка для ObjectContext. Здесь хорошо answer про свой вопрос. Возможно, что для облегчения использования они пожертвовали производительностью.

-3

Я использую Simple.Data для запроса миллионов записей, и он работает достаточно хорошо и быстро.

4

Я обеспокоен также неудовлетворительный код первого подхода, и я провел некоторые тесты в сценарии, подобных вашего

http://netpl.blogspot.com/2013/05/yet-another-orm-micro-benchmark-part-23_15.html

Результаты были не сюрпризом, так как DbContext является обертка поверх ObjectContext, она должна принести в жертву производительность для простоты. Тем не менее, мои тесты показывают, что:

  • больше записей вы извлекаете тем меньше разницы
  • тем больше записей вы извлекаете более важно, чтобы отключить отслеживание, если вы хотите быть быстрее

Например, получение всего 10 записей

enter image description here

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

Однако при получении 10000 строк у вас есть

enter image description here

Обратите внимание, что нет почти никакой разницы между кодом первой и моделью первой в версии NoTracking. Кроме того, оба они работают на удивление хорошо, почти так же быстро, как исходный datareader ado.net.

Следуйте за моей записью в блоге для получения более подробной информации.

Этот простой тест помог мне сначала принять характер кода. Я по-прежнему предпочитаю его для небольших проектов из-за двух особенностей: poco-сущностей и миграций. С другой стороны, я бы никогда не выбрал ни одного из них для проекта, где производительность является критическим требованием. Это фактически означает, что я, вероятно, никогда не буду использовать модель первого подхода снова.

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

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