Сравните Linq2SQL, Subsonic2, Subsonic3 - Какие-либо другие идеи сделать их быстрее?

Я работаю с Дозвуковым 2 больше чем 3 года теперь...

После того, как Linq появляется и затем Дозвуковые 3, я начинаю думать о перемещении в новые фьючерсы Linq, которые подключены к sql.

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

Затем я тестирую Linq2Sql и вижу, что также задержка - сравнивает его с Дозвуковыми 2.

Мой вопрос здесь, особенный для linq2sql и предстоящей dotnet версии 4, что еще я могу сделать для ускорения его? Что еще на linq2sql настройках или классах, не на этом коде, который я использовал для своего messures

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

Как я делаю тесты - и точные из моих мер.

Я использую только для моего вопроса Google Chrome, потому что его трудное для меня, чтобы показать здесь много других мер, что я сделал с более сложными программами. Это - самое простое, я просто измеряю Чтение Данных. Как я могу доказать это. Я делаю простой Поток. Сон (10 секунд) и видит, вижу ли я, что 10 секунд на Мере по Google Chrome и да вижу его.


(источник: planethost.gr)

вот больше теста с этим Сном thead для наблюдения то, что является на самом деле Chrome, дает.

Задержка 10 секунд
Задержка на 100 мс
Нулевая задержка

Существует только маленький 15 мс, которые это, входят в messure, является столь маленьким, сравнивают его с остальной частью моих тестов, что я не забочусь о.

Таким образом, что я измеряю

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

Почему я выбрал этот вид теста

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

Теперь позволяет, тестирует dals

Запустите, видят это изображение, у меня есть 4-5 запросов к каждому методу, один за другим.

Результаты. Для цикла 100 раз попросите 5 строк, один не существуют, приблизительно..

Простой adonet:81ms
SubSonic 2:210ms
linq2sql:1.70sec
использование linq2sql CompiledQuery. Скомпилируйте:239ms
Дозвуковые 3:15.00sec (ничего себе - медленное экстремальное значение)

http://www.planethost.gr/DalSpeedTests.rar проекта


Кто-либо может подтвердить этот сравнительный тест или сделать какую-либо оптимизацию для выручения меня?

Другие тесты

Кто-то публикует здесь эту ссылку http://ormbattle.net/ (и затем удалите ее - Дон не знает, почему) На этой странице можно найти действительно полезные усовершенствованные тесты для всех, кроме дозвуковых 2 и дозвуковых 3, что я имею здесь!

Оптимизация

Что я действительно спрашиваю, вот то, если кто-то может теперь какой-либо прием, как оптимизировать DALs, не путем изменения тестового кода, а путем изменения кода и настроек на каждом dal. Например...

Оптимизация Linq2SQL

Я запускаю поиск, как оптимизировать Linq2sql и нашел эту статью, и возможно больше существует.

Наконец я делаю приемы из той страницы, чтобы выполнить, и оптимизировать код с помощью них всех. Скорость была близка 1,50 секунды от 1,70.... больших улучшений, но все еще замедлитесь.

Затем я нашел другой путь - та же статья идеи, и ничего себе! скорость является аварийным завершением. Используя этот прием с CompiledQuery. Скомпилируйте, время с 1,5 секунд - теперь 239 мс. Вот код для предварительно скомпилированного...

Func> compiledQuery =
    CompiledQuery.Compile((DataClassesDataContext meta, int IdToFind) =>
                          (from myData in meta.Products
                           where myData.ProductID.Equals(IdToFind)
                           select myData));

StringBuilder Test = new StringBuilder();
int[] MiaSeira = { 5, 6, 10, 100, 7 };

using (DataClassesDataContext context = new DataClassesDataContext())
{
    context.ObjectTrackingEnabled = false;

    for (int i = 0; i < 100; i++)
    {
        foreach (int EnaID in MiaSeira)
        {
            var oFindThat2P = compiledQuery(context, EnaID);

            foreach (Product One in oFindThat2P)
            {
                Test.Append("
"); Test.Append(One.ProductName); } } } }

Оптимизация SubSonic 3 и проблем

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

Вот некоторое получение моего профилирования и точек задержки в дозвуковом исходном коде

Я имею, заканчиваются, что subsonic3 делают больше запроса к структуре базы данных, а не на самих данных. Потребности пересмотреть дыру способ попросить данные и следовать за subsonic2 идеей, если это возможно.

Попытайтесь сделать предварительную компиляцию к дозвуковым 3 как, я сделал в linq2Sql, но сбое в настоящий момент...

Оптимизация SubSonic 2

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

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

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

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

Результаты, на 5% быстрее на базе данных NorthWind, почти на 20% быстрее на моей базе данных с 250 таблицами. Это - количество с на 500 мс меньше в процессе 10 секунд на northwind, на 100 мс быстрее на моей базе данных по времени процесса на 500 мс. У меня нет получений, чтобы показать Вам для того, что, потому что я сделал их с другим кодом, другое время, и разыскивают их на бумаге.

Так или иначе это - моя история и мой вопрос на всем этом, что еще делает Вы знаете для создания их еще быстрее...

Поскольку это имеет размеры, у меня есть использование Дозвуковые 2.2, оптимизированные мной, Дозвуковые 3.0.0.3, немного оптимизированные мной и Dot. Сетевые 3.5

7
задан 19 revs, 4 users 71% 24 June 2019 в 10:05
поделиться

5 ответов

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

Если вы хотите что-то по-настоящему протестировать, вам нужно использовать консоль и запускать циклы чтения, которые работают с индексированными данными. Что вы сделали, так это создали веб-страницу и сказали: «Давайте посмотрим, что произойдет при загрузке».

Это ошибочно по ряду причин. Во-первых, весь написанный код должен быть скомпилирован из IL do ML. Поскольку SubSonic генерирует ваш код для вас, и поскольку я знаю, что у вас здесь много таблиц (300+, если я правильно помню), вы можете себе представить, что при вашей первой загрузке под крышками ведется некоторая работа.

Честно говоря, ваша неопытность сводит на нет большую работу, которую я проделал бесплатно, размещая такие вещи, как «это медленно и не готово». Меня не волнует, используют ли люди SubSonic - меня волнует, когда люди делают глупые вещи (например, тестовые веб-тесты) и обвиняют в этом меня.

1
ответ дан 7 December 2019 в 10:00
поделиться

Я думаю, чтобы получить лучший бенчмарк на них, вы должны проверить время в sql profiler, а не в google chrome, потому что в браузере может быть много вещей, влияющих на скорость загрузки страницы.

1
ответ дан 7 December 2019 в 10:00
поделиться

На основе вашего примера вы можете улучшить производительность, используя следующий код:

 StringBuilder Test = new StringBuilder();
 int[] MiaSeira = { 5, 6, 10, 100, 7 };
 for (int i = 0; i < 100; i++)
 {
     foreach (int EnaID in MiaSeira)
     {
         var Products = (from product in Product.
             where MiaSeira.Contains(product.ProductID)
             select product).ToList();

         if (Products == null || Products.Count == 0)
             continue;

         foreach (Product product in Products)
         {
            Test.Append("<br />");
            Test.Append(product.ProductName);
         }
     }
 }

 txtDebug.Text = Test.ToString();
1
ответ дан 7 December 2019 в 10:00
поделиться

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

0
ответ дан 7 December 2019 в 10:00
поделиться

Аристос, вот с чем у меня проблема. Вы разместили вопрос в наших группах, и у нас состоялся приятный обмен письмами длиной в 23 часа. Вы настаивали, что у SubSonic 3 есть проблемы, и спрашивали меня, почему я не исправил этот "медленный, сломанный инструмент".

Я попытался объяснить вам, что при наличии 233 таблиц, SubSonic должен прочитать схему КАЖДОЙ таблицы при загрузке. Это не типичное использование для SubSonic 3, но мы делаем это таким образом, поэтому при последующих загрузках он работает быстрее, чем SubSonic 2.

Вы проглатываете это. Я отвечаю вам. RBarry оставил комментарий выше, что я "принижаю". Я очень расстроен. Вы, кажется, думаете, что я не тестировал эту штуку, а я тестировал, МНОГО МНОГО раз. Я не могу создать ORM с проблемами, подобными тем, что вы предложили, и я этого не делал.

Вы должны понимать, что если бы SubSonic требовалось 10 секунд для выполнения запроса, то его бы не использовали.

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

Это слишком много. SubSonic - не ваш инструмент.

3
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: