SubSonic & LinqTemplate: Почему чтение здесь происходит так медленно? - PullRequest
0 голосов
/ 07 мая 2011

Не уверен, где передать эту информацию дозвуковой команде, когда они закрывали свои форумы и говорили, что используют stackoverflow, так что мы идем.

Я изо всех сил пытался достичь максимальной производительности с помощью ORM. Мне нравится Subsonic, и его массовая вставка, обновление, удаление уничтожает Entity Framework в этом контексте, однако для простых простых операций чтения EF выдувает дозвуковые сигналы из воды с 5-кратной скоростью.

Я сократил оба, удалил отслеживание изменений, внешние свойства, навигационные свойства, все до poco.

EF выполняет простой выбор из 1M строк примерно за 4.8, SubSonic Linq берет 5x, что ...

Глядя на профилировщик SQL, вызов немного отличается: Entity Framework: SELECT TOP (1000000) [c].[Id] AS [Id], [c].[ProjectIDL] AS [ProjectIDL], [c].[DescriptorIDL] AS [DescriptorIDL], [c].[FieldIDL] AS [FieldIDL], [c].[Data] AS [Data], [c].[OptionId] AS [OptionId] FROM [dbo].[DescriptorFieldValues] AS [c]

SubSonic: SELECT TOP (1000000) [t0].[Data], [t0].[DescriptorIDL], [t0].[FieldIDL], [t0].[Id], [t0].[OptionId], [t0].[ProjectIDL] FROM [dbo].[DescriptorFieldValues] AS t0

Профилировщик SQL выполняет трассировку и показывает существенную разницу в продолжительности.
Я проверил логин аудита перед обоими запросами, и они идентичны ...

Если я выполняю один и тот же запрос в sql management studio, для обоих запросов это займет 11 секунд

Глядя на дозвуковой источник 3.04, я не могу понять, где бы я сделал корректировку, чтобы она соответствовала EF, но действительно ли синтаксис запроса здесь действительно имеет большое значение, или происходит какое-то волшебство, не в курсе?

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 12 мая 2011

После того, как Роб Корни отчитал за желание узнать, почему SubSonic медленнее по сравнению с EF, и сказал, что мы глупы, если хотим узнать, почему SubSonic не работает, мы считаем, что наша команда определила пару мест для решения этих проблем производительности:

  1. В Extensions / Database.cs Load использует для каждой строки, для каждого свойства отражение для сериализации данных в конкретный объект.
  2. В Extensions / Database.cs ToEnumerable все преобразования DataReader выполняются в 1 последовательном цикле while.
  3. в ExecutionBuilder - этот компилятор запросов представляет собой прямую копию вставки альфы только для образовательных целей и является компилятором запросов.ужасно устарел с помощью DynamicInvoke.

Наша команда планирует внести следующие изменения в следующем порядке:

  1. In Extensions / Database.cs ToEnumerable pullсвойство раз в один и передает их в нагрузку, это, как полагают, оказывает минимальное влияние на производительность, но, вероятно, оказывает существенное влияние на использование памяти.

  2. Изменение ToEnumerable для многопоточности материализации для больших наборов данных.

  3. Добавить метод в фабрики объектов, чтобы обеспечить возможность построения объекта из datarow без использования отражения, и вместо этого использовать генерацию кода шаблона t4 заранее.
  4. Внутри загрузки проверьте активатор объекта для этого метода интерфейса, если это так, используйте его, если нет, по умолчанию обратно на отражательную сериализацию.
  5. Обновите ExceutionBuilder, чтобы избежать использования DynamicInvoke.

Надеюсь, это должно привести к удовлетворению наших потребностей в производительности.

Спасибо Джеффу V, Кену I и QES за помощь.Грустно видеть, что создатель SubSonic Роб Корни так защищается от производительности SubSonic, когда кажется, что его довольно легко решить.~ JT

1 голос
/ 28 июня 2011

Subsonic 3 очень медленный, потому что его нужно компилировать снова и снова, и снова то же самое думает перед тем, как перейти на сервер sql и запросить результаты.

И эта компиляция происходит начасть linq.

Например, для простой статической команды, такой как "Select * FROM Products WHERE ProductID > 100", которая набрана в дозвуковой 3 как Products.Find(x => (x.ProductID > 100), сначала нужно много времени для преобразования в строковую команду, а я имею в виду очень долгое время.

Это основная причина, по которой subsonic такой медленный, и именно поэтому subsonic 3. ничего не стоит.

В linq трюк - это функция CompiledQuery.Compile, которая компилирует ее один раз и запоминает в памяти,Как бы то ни было, для меня и моих стандартов это тоже медленно.

Теперь вернемся к дозвуковой версии 2, это действительно хорошая идея, но все еще требует большой оптимизации внутри.Видимо они не слишком много думают о скорости.В любом случае, с некоторой оптимизацией Subson 2 может быть очень быстрым, рядом с простыми командами ado.

Мои тесты год назад: Тесты Linq2SQL, Subsonic2, Subsonic3 - Есть ли другие идеи, чтобы сделать их быстрее?

Моя идея состоит в том, чтобы вернуться к дозвуковому 2 и сделать его лучше и быстрее, и отбросить дозвуковую 3. Я благодарю их за дозвуковую 2 и 3, но в версии 3 они терпят неудачу, это нормально, явсе эти годы сделали слишком много программ, и не все они использовали.Ничего страшного.

1 голос
/ 07 мая 2011

Помимо того, что ваш запрос SubSonic, по-видимому, не выбирает поле идентификатора, два оператора SQL для всех намерений и целей идентичны. Обнаружение того, что два запроса занимают одинаковое количество времени в SQL Management Studio, похоже, подтверждает это.

Это может указывать на то, что SubSonic на самом деле требует больше времени, чем EF. Известно, что у SubSonic есть некоторые проблемы с производительностью , которые наверняка могут объяснить эту разницу.

На самом деле нам понадобится гораздо больше подробностей о вашем точном использовании, чтобы действительно определить ответ, почему этот запрос медленнее для вас.

Кроме того, если вы ищете текущую активность и помощь в SubSonic, вам следует попробовать их группу Google .

Создатель SubSonic Роб Конери прекратил работать над ним довольно давно, и «команда SubSonic» не выпустила каких-либо существенных обновлений (если они вообще есть, я не думаю, что они есть, но я не совсем уверен). Это проект, который вы также можете считать «законченным», поскольку работа над проектом прекращена (для всех практических целей), но в некотором смысле больше работы не требуется (она работает).

Кстати, та страница, на которой написано, что форумы SubSonic закрыты и попадают в StackOverflow - ну, эти страницы вообще не обновлялись более года, может быть 2.

...