Тестирование накладных расходов на решение ORM-решения – как?
Я создал прототип пользовательского инструмента ORM с использованием аспектно-ориентированного программирования (PostSHarp) и достижения незнания незнания (перед компиляцией). Теперь я попытался выяснить, сколько накладных расходов он вводит по сравнению с использованием чистых DataReader и ADO.NET. Я сделал тестовый пример – вставку, чтение, удаление данных (около 1000 записей) в MS SQL Server 2008 и MySQL Community Edition. Я запускаю этот тест несколько раз с использованием чистого ADO.NET и моего настраиваемого инструмента.
Я ожидал, что результаты будут зависеть от многих факторов: памяти, подкачки, процессора, других процессов, поэтому я много раз тестировал тесты (20-40). Но результаты были действительно неожиданными. Они просто слишком сильно различались между этими случаями. Если бы были какие-то экстремальные значения, я мог бы игнорировать их (возможно, меняться или что-то подобное), но они были настолько разными, что я уверен, что не могу доверять такому тестированию. Почти половина раз мой ORM показал на 10% лучшую производительность, чем чистый ADO.NET, иногда это было -10%.
Есть ли способ сделать эти тесты надежными? У меня нет мощного компьютера с большим количеством памяти, но, может быть, я каким-то образом смогу сделать MS SQL и MySQL или ADO.NET максимально согласованными во время этих тестов? И как насчет подсчета записей – что более надежно, используя небольшое количество записей и работает больше раз или иначе?
- Как избежать «восстановления статистики SQL Server» при выполнении тестирования производительности?
- Ввод базы данных SQL Server
- Должны ли данные UAT быть зеркалом производства? И если да, то как?
- Создание и запуск тестового модуля SQL Server Visual Studio 2015
- Бенчмаркинг планов выполнения SQL Server для автоматического тестирования?
- Единичные тесты для кода C #, где происходит первичная обработка SQL-хранимых процедур
- Поиск .NET (SQL-Server) Testmanagement Tool
- Создание тестовых данных в SQL Server
- Данные тестирования качества
- хранимые процедуры и тестирование - все еще проблема даже сегодня. Зачем?
- Что такое шаги для просмотра хранимой процедуры SQL для выполнения подсчетов и времени выполнения
- Entity Framework не может удалить базу данных, используемую базу данных
- Тестирование производительности базы данных Greenfield
Вы видели ORMBattle.NET ? См. Часто задаваемые вопросы , есть некоторые идеи, связанные с измерением служебных издержек, введенных конкретным инструментом ORM. Набор тестов является открытым исходным кодом .
Что касается ваших результатов:
- Некоторые инструменты ORM автоматически упорядочивают последовательность операторов (т. Е. Посылают несколько операторов SQL вместе). Если эта функция хорошо реализована в ORM, легко выполнить обычную ADO.NET в 2-4 раза на CRUD-операциях, если тест ADO.NET не предполагает пакетной обработки. Тесты на ORMBattle.NET проверяют оба случая.
- Многое зависит от того, как вы устанавливаете границы транзакций. Пожалуйста, обратитесь к FAQ ORMBattle.NET для получения более подробной информации.
- Тесты CRUD не являются лучшим показателем эффективности. В общем, здесь довольно легко получить максимальную производительность, поскольку в общем случае СУБД в этом случае должны делать гораздо больше, чем ОРМ.
PS Я один из авторов ORMBattle.NET, поэтому, если вас интересуют детали / возможные вклады, вы можете напрямую связаться со мной (или присоединиться к группам ORMBattle.NET Google ).
Я бы продолжил тест на более длительный период и с большим количеством итераций, поскольку небольшие различия усреднялись со временем, и вы должны получить более четкое изображение. Кроме того, убедитесь, что вы устраняете любые внешние факторы, которые могут повлиять на ваш тест, например, другие процессы, не имеющие достаточной свободной памяти, холодный старт и теплый старт, использование сети и т. Д.
Кроме того, убедитесь, что ваш файл базы данных и файл журнала имеют достаточно свободного места, поэтому вы не дожидаетесь, когда БД вырастет файл во время определенных тестов.
Прежде всего, вам нужно выяснить, откуда возникает дисперсия. Сам уровень ORM или база данных?
Источником такой дисперсии часто является сама база данных. Базы данных – это очень сложные системы, в которых многие активные процессы могут взаимодействовать с результатом измерений производительности. Чтобы достичь некоторых репродуцируемых результатов, вам необходимо разместить свою базу данных в «лабораторных условиях» и убедиться, что ничего неожиданного не происходит. что это означает, зависит от поставщика от поставщика, и вам нужно знать некоторые довольно продвинутые темы, чтобы сделать что-то вроде этого. Например, в базе данных SQL Server типичными источниками изменения являются:
- холодный кэш против теплого кеша (как данные, так и процедуры)
- события журнала и базы данных
- ремонтные работы
- очистка призраков
- ленивый писатель
- контрольно-пропускные пункты
- давление внешней памяти