Сравнение скорости извлечения данных из Linq-to-SQL - PullRequest
4 голосов
/ 08 февраля 2012

Кто-то скажет мне, почему Linq-to-SQL так быстро получает данные?

Я провел тесты производительности с Linq-to-SQL, EF4, DataSet и MyORM.

Linq-to-SQL всегда быстрее, см. Таблицу ниже:

  • Linq-to-SQL = 570 миллисекунд для извлечения 50000 записей
  • DataSet = 2,100 миллисекунд дополучить 50000 записей
  • EF4 = 1.200 миллисекунд для получения 50000 записей
  • MyORM = 700 миллисекунд для получения 50000 записей

Я использовал SQL Server 2005 (local) и единую таблицу для анализа.

MyORM была реализована мной.Является ли простой метод извлечения данных с использованием DataReader и Fasterflect для заполнения свойств IList of T.

Какова стратегия Linq-to-SQL для достижения этой производительности?

1 Ответ

2 голосов
/ 12 февраля 2012

LINQ to SQL выполняет ряд трюков.Если ваш собственный ORM использует рефлексию, вам нужно будет ее кешировать, но я подозреваю, что разница может заключаться в том, что вы не кешируете ординалы.переменная для каждого порядкового номера и ссылка на них внутри вашего цикла:

var someFieldIdx = dataReader.GetOrdinal("SomeField");
...
while(dataReader.Read()) {
    ...    
    myNewObj.SomeProperty = dataReader.GetInt32(someFieldIdx);
    ...
}

Еще лучше было бы кэшировать их по некоторым статическим переменным.

Если вы уже делаете это, возможно, вы захотите опубликовать часть своего кода ORM, который создает экземпляры объектов.

...