<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN"
        "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
<!--<?xml-stylesheet type="text/xsl" href="article.xsl"?>-->
<article article-type="research-article" dtd-version="1.2" xml:lang="en" xmlns:mml="http://www.w3.org/1998/Math/MathML"
         xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <front>
        <journal-meta>
            <journal-id journal-id-type="issn">2303-9868</journal-id>
            <journal-id journal-id-type="eissn">2227-6017</journal-id>
            <journal-title-group>
                <journal-title>Международный научно-исследовательский журнал</journal-title>
            </journal-title-group>
            <issn pub-type="epub">2303-9868</issn>
            <publisher>
                <publisher-name>ООО Цифра</publisher-name>
            </publisher>
        </journal-meta>
        <article-meta>
            <article-id pub-id-type="doi">10.60797/IRJ.2024.148.145</article-id>
            <article-categories>
                <subj-group>
                    <subject>Brief communication</subject>
                </subj-group>
            </article-categories>
            <title-group>
                <article-title>Исследование производительности технологий объектно-реляционного отображения при взаимодействии с Microsoft SQL Server
                </article-title>
            </title-group>
            <contrib-group>
                <contrib contrib-type="author" corresp="yes">
                    <contrib-id contrib-id-type="orcid">https://orcid.org/0000-0001-9359-911X</contrib-id>
                    <name>
                        <surname>Гибадуллин</surname>
                        <given-names>Руслан Фаршатович</given-names>
                    </name>
                    <email>landwatersun@mail.ru</email>
                    <xref ref-type="aff" rid="aff-1">1</xref>

                </contrib><contrib contrib-type="author">
                    
                    <name>
                        <surname>Ёкубджонов</surname>
                        <given-names>Джахонгир Исмоилджонович</given-names>
                    </name>
                    <email>jahon-0000@mail.ru</email>
                    <xref ref-type="aff" rid="aff-2">2</xref>

                </contrib>
            </contrib-group>
            <aff id="aff-1"><label>1</label>Казанский национальный исследовательский технический университет</aff><aff id="aff-2"><label>2</label>Казанский национальный исследовательский технический университет им. А.Н. Туполева – КАИ</aff>
            
        <pub-date publication-format="electronic" date-type="pub" iso-8601-date="2024-10-17">
            <day>17</day>
            <month>10</month>
            <year>2024</year>
        </pub-date>
        
            
        <pub-date pub-type="collection">
            <year>2024</year>
        </pub-date>
        
            <volume>11</volume>
            <issue>148</issue>
            <fpage>1</fpage>
            <lpage>11</lpage>
            <history>
                
        <date date-type="received" iso-8601-date="2024-08-14">
            <day>14</day>
            <month>08</month>
            <year>2024</year>
        </date>
        
                
        <date date-type="accepted" iso-8601-date="2024-09-25">
            <day>25</day>
            <month>09</month>
            <year>2024</year>
        </date>
        
            </history>
            <permissions>
                <copyright-statement>Copyright: &#x00A9; 2022 The Author(s)</copyright-statement>
                <copyright-year>2022</copyright-year>
                <license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
                    <license-p>This is an open-access article distributed under the terms of the Creative Commons
                        Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution,
                        and reproduction in any medium, provided the original author and source are credited. See <uri
                                xlink:href="http://creativecommons.org/licenses/by/4.0/">
                            http://creativecommons.org/licenses/by/4.0/</uri>.
                    </license-p>
                </license>
            </permissions>
            <self-uri xlink:href="https://research-journal.org/archive/10-148-2024-october/10.60797/IRJ.2024.148.145"/>
            <abstract>
                <p>В условиях стремительного роста объемов данных и увеличения требований к производительности современных информационных систем, выбор оптимальной технологии для работы с базами данных становится ключевым аспектом разработки программного обеспечения. В данной статье проводится сравнительный анализ двух широко используемых в экосистеме .NET технологий объектно-реляционного отображения – Dapper и Entity Framework. Исследование фокусируется на оценке производительности этих инструментов при взаимодействии с Microsoft SQL Server в контексте выполнения операций вставки, выборки, обновления и удаления данных. В статье детально рассматриваются критерии оценки, такие как время отклика, потребление системных ресурсов и масштабируемость. Результаты тестирования демонстрируют значительные различия в производительности между Dapper и Entity Framework, что позволяет разработчикам сделать осознанный выбор технологии в зависимости от специфики задач и требований к производительности.</p>
            </abstract>
            <kwd-group>
                <kwd>ORM</kwd>
<kwd> Dapper</kwd>
<kwd> Entity Framework</kwd>
<kwd> производительность</kwd>
<kwd> Microsoft SQL Server</kwd>
<kwd> объектно-реляционное отображение</kwd>
<kwd> время отклика</kwd>
<kwd> потребление ресурсов</kwd>
<kwd> масштабируемость</kwd>
<kwd> .NET</kwd>
<kwd> разработка программного обеспечения</kwd>
<kwd> базы данных</kwd>
</kwd-group>
        </article-meta>
    </front>
    <body> 
        
 
        
<sec>
	<title>HTML-content</title>
	<p>1. Введение</p>
	<p>Современные информационные системы сталкиваются с возрастающими требованиями к эффективности обработки и доступу к данным, что делает взаимодействие с базами данных ключевым элементом их архитектуры [1], [2], [3]. В условиях экспоненциального роста объемов данных и ужесточения требований к производительности, правильный выбор технологии для работы с базами данных приобретает стратегическое значение. Одним из эффективных решений является применение технологий объектно-реляционного отображения (ORM, англ. Object-Relational Mapping), которые позволяют разработчикам взаимодействовать с базами данных посредством объектно-ориентированных подходов. Это не только упрощает написание кода, но и способствует его лучшей поддерживаемости и масштабируемости. В рамках данного исследования будет проведен сравнительный анализ производительности двух широко используемых технологий ORM в экосистеме .NET – Dapper [4] и Entity Framework [5] – при работе с Microsoft SQL Server [6]. Исследование направлено на оценку эффективности данных инструментов в условиях различных сценариев взаимодействия с базой данных, что позволит определить оптимальный выбор ORM технологии в зависимости от специфики задач и требований к производительности.</p>
	<p>В современном мире IT объемы данных стремительно растут, требуя создания высокопроизводительных и масштабируемых систем управления базами данных. Бизнесы зависят от эффективности информационных систем, обеспечивающих быстрый доступ к данным и их обработку. Выбор технологии для работы с базами данных становится ключевой задачей разработки программного обеспечения (ПО).</p>
	<p>Технологии объектно-реляционного отображения упрощают взаимодействие с базами данных, предоставляя абстракцию над реляционной моделью данных и позволяя работать в объектно-ориентированном стиле. Это упрощает разработку и уменьшает вероятность ошибок, связанных с ручным написанием SQL-запросов. Однако ORM может влиять на производительность приложения, поэтому важно тщательно анализировать и тестировать производительность различных ORM-технологий для обоснованного выбора.</p>
	<p>Entity Framework и Dapper являются двумя популярными ORM-технологиями в экосистеме .NET. Entity Framework предлагает мощные возможности по автоматизации работы с базами данных, но может быть медленнее и требовать больше ресурсов по сравнению с более легковесным Dapper, который предоставляет минимальную абстракцию над SQL и позволяет напрямую выполнять запросы к базе данных с минимальными накладными расходами. В условиях ограниченных ресурсов и высоких требований к производительности, особенно для высоконагруженных систем, выбор между этими технологиями становится критически важным.</p>
	<p>Кроме того, современные приложения часто требуют от разработчиков обеспечения высокой производительности на всех уровнях стека, от базы данных до пользовательского интерфейса. Неправильный выбор ORM может привести к значительным потерям производительности, увеличению времени отклика системы и, как следствие, ухудшению пользовательского опыта. В условиях конкуренции и стремительного развития технологий, это может негативно сказаться на бизнес-показателях компании.</p>
	<p>Важность исследования производительности технологий ORM [7] также обусловлена тенденцией к миграции приложений в облако, где оптимизация ресурсов и сокращение эксплуатационных расходов играют ключевую роль. Облачные сервисы предоставляют возможность масштабирования, но также требуют тщательного управления ресурсами и затратами. Оптимизация работы с базой данных с помощью правильного выбора ORM может существенно повлиять на эффективность использования облачных ресурсов и снижение расходов.</p>
	<p>Таким образом, предоставление разработчикам и архитекторам программного обеспечения объективной и актуальной информации о производительности и эффективности технологий ORM является крайне актуальным, поскольку позволяет оптимизировать разработку и эксплуатацию информационных систем, улучшить производительность приложений, сократить эксплуатационные расходы и повысить удовлетворенность пользователей.</p>
	<p>Работа направлена на сравнительный анализ производительности и нагрузки на процессор двух .NET технологий ORM – Dapper и Entity Framework, для определения наиболее эффективного подхода при работе с Microsoft SQL Server.</p>
	<p>Практическую ценность работы заключается в предоставлении разработчикам и архитекторам программного обеспечения конкретных данных и рекомендаций по выбору технологии ORM при работе с Microsoft SQL Server. Результаты исследования помогут выбрать наиболее производительное решение, минимизировать нагрузку на процессор и оптимизировать время отклика приложений, что особенно важно в условиях больших объемов данных и высоких требований к производительности.</p>
	<p>2. Анализ производительности ORM-технологий</p>
	<p>В данном разделе статьи рассматривается анализ производительности ORM-технологий для среды .NET и SQL Server. Рассматривается процесс выбора ключевых ORM-инструментов, а также формулирование критериев, по которым будет проводиться сравнение производительности этих технологий.</p>
	<p>Введём определения, связанные с процедурой анализа производительности ORM-технологий, важные в контексте разрабатываемой методологии:</p>
	<p>1. Ключевые ORM-технологии для .NET и SQL Server – инструменты для объектно-реляционного отображения, используемые в среде .NET для взаимодействия с базой данных SQL Server. К ним относятся Entity Framework и Dapper. Эти технологии выбраны для исследования на основе их популярности и широкого использования в промышленной разработке.</p>
	<p>2. Время отклика – один из основных критериев оценки производительности ORM-технологий, представляющий собой время, затрачиваемое на выполнение запросов к базе данных. Измеряется в миллисекундах и позволяет оценить быстродействие технологии при выполнении операций чтения и записи данных.</p>
	<p>3. Потребление ресурсов – критерий, характеризующий использование системных ресурсов, таких как оперативная память и процессорное время, при работе с ORM-технологией. Оценка потребления ресурсов позволяет определить эффективность использования вычислительных мощностей.</p>
	<p>Существует множество ORM-инструментов для объектно-ориентированного программирования: для Java используются Hibernate, TopLink и OpenJPA; для Python – Django, Peewee и SQLAlchemy; для PHP – RedBeanPHP, Doctrine и Propel. В среде .NET широко используются Dapper и Entity Framework. В данном исследовании проводится сравнение характеристик этих ORM-инструментов. Мы выбрали Dapper и Entity Framework для более детального анализа, так как они представляют два подхода к ORM в .NET экосистеме: Dapper как легковесный и высокопроизводительный микро ORM, и Entity Framework как полнофункциональный и гибкий инструмент, предоставляющий широкий спектр возможностей для работы с базами данных.</p>
	<p>3. Критерии оценки</p>
	<p>Для оценки производительности различных ORM инструментов, таких как Dapper и Entity Framework (EF), необходимо определить четкие и объективные критерии. Эти критерии помогут оценить эффективность каждого инструмента в различных сценариях использования. В данной работе используются следующие основные критерии: время обработки запроса, потребление ресурсов и масштабируемость. Используются библиотеки BenchmarkDotNet и EtwProfiler [8].</p>
	<p>Время обработки является критическим показателем, который отражает скорость выполнения операций. Для оценки времени обработки в данной работе рассматриваются следующие аспекты:</p>
	<p>CRUD [9] операции: измерение времени, необходимого для выполнения операций создания (Create), чтения (Read), обновления (Update) и удаления (Delete).</p>
	<p>1. Create: время, затраченное на вставку новой записи в базу данных.</p>
	<p>2. Read: время, необходимое для чтения данных из базы.</p>
	<p>3. Update: время, затраченное на обновление существующей записи.</p>
	<p>4. Delete: время, необходимое для удаления записи из базы данных.</p>
	<p>Для выполнения этих измерений используется BenchmarkDotNet – высокоточная библиотека для проведения микро-бенчмарков на платформе .NET. Она предназначена для измерения производительности и оптимизации кода. С помощью BenchmarkDotNet можно легко измерить время выполнения, потребление памяти и другие метрики производительности для различных методов и алгоритмов.</p>
	<p>Основные возможности BenchmarkDotNet:</p>
	<p>1. Точность и надёжность: BenchmarkDotNet минимизирует влияние на измерения внешних факторов, таких как другие процессы, путем выполнения бенчмарков в изолированном контексте. Он автоматически выполняет множество итераций и вычисляет статистически значимые результаты.</p>
	<p>2. Автоматическое управление средой: библиотека автоматически настраивает окружение для тестов, например, контролирует работу сборщика мусора, что позволяет получать более стабильные результаты.</p>
	<p>3. Поддержка различных платформ: BenchmarkDotNet поддерживает несколько .NET платформ, включая .NET Framework, .NET Core, Mono и CoreRT.</p>
	<p>4. Широкий спектр метрик: помимо времени выполнения, BenchmarkDotNet позволяет измерять потребление памяти, количество генерируемого мусора и другие важные параметры.</p>
	<p>5. Гибкость конфигурации: библиотека предлагает множество настроек и атрибутов для настройки поведения тестов, включая параметры прогрева, количество итераций и другие.</p>
	<p>Для того чтобы добавить BenchmarkDotNet в свой проект, нужно выполнить следующие шаги:</p>
	<p>1. Установить пакет NuGet BenchmarkDotNet в проект, выполнив команду Install-Package BenchmarkDotNet.</p>
	<p>2. Создать класс, который будет содержать тесты производительности, и пометить его атрибутом [MemoryDiagnoser] и [RankColumn].</p>
	<p>3. Запустить тесты, выполнив команду BenchmarkRunner.Run&lt;MyBenchmarks&gt;().</p>
	<p>Нагрузка на процессор: измеряется использование CPU во время выполнения операций. Для более точной оценки нагрузки на процессор в операциях обновления (Update) и удаления (Delete) применяется EtwProfiler.</p>
	<p>EtwProfiler – это профайлер, который использует Event Tracing for Windows (ETW) для сбора данных о производительности. Этот профайлер помогает разработчикам получать подробные сведения о производительности своего кода, такие как использование процессора, I/O операции, события памяти и многое другое.</p>
	<p>После выполнения тестов BenchmarkDotNet создаст ETL файл (Event Trace Log). Этот файл содержит данные о производительности, собранные ETW.С помощью программы Windows Performance Analyzer (WPA) можно открыть и проанализировать собранные данные ЦП.</p>
	<p>4. Разработка тестовых сценариев</p>
	<p>Основная цель тестирования – сравнить производительность EF и Dapper при выполнении следующих операций с базой данных:</p>
	<p>1. Вставка:</p>
	<p>1.1. Вставка одиночной записи.</p>
	<p>1.2. Вставка множества записей.</p>
	<p>2. Выборка:</p>
	<p>2.1. Выборка всех записей.</p>
	<p>2.2. Выборка записей по ID.</p>
	<p>2.3. Выборка записей с фильтрацией (по имени, дате и т.д.).</p>
	<p>3. Поиск записей по заданным критериям, используя различные операторы сравнения (равно, содержит, начинается с и т.д.).</p>
	<p>4. Обновление:</p>
	<p>4.1. Обновление отдельных записей.</p>
	<p>4.2. Обновление нескольких записей.</p>
	<p>5. Удаление:</p>
	<p>5.1. Удаление отдельных записей.</p>
	<p>5.2. Удаление нескольких записей.</p>
	<p>Производить замеры будем с помощью библиотеки BenchmarkDotNet, которая будет настроена с дополнительными диагностическими инструментами для отслеживания использования памяти и потоков, а также для профилирования ETW (Event Tracing for Windows) [10].</p>
	<p>Основные компоненты и настройки:</p>
	<p>1. MemoryDiagnoser: отслеживает потребление памяти во время выполнения тестов, позволяя выявить потенциальные утечки памяти и оценить эффективность использования ресурсов.</p>
	<p>2. ThreadingDiagnoser: анализирует работу потоков, помогая выявить узкие места, связанные с параллельным выполнением кода.</p>
	<p>3. EtwProfiler: профилирует события ETW. Это позволяет получить детальную информацию о работе операционной системы и выявить скрытые проблемы, влияющие на производительность.</p>
	<p>Разработанные тесты позволяют всесторонне оценить производительность различных операций с базой данных с использованием EF и Dapper. Эти тесты помогут определить наиболее эффективные технологии и подходы для различных сценариев работы с данными в .NET приложениях.</p>
	<p>Для тестирования производительности используется база данных, содержащая несколько таблиц. Эти таблицы имитируют типичные сценарии работы с данными в реальных приложениях, такие как управление пользователями, заказами и продуктами.</p>
	<p>Для генерации данных в таблицах используется библиотека Bogus. Bogus – это мощная библиотека для .NET, позволяющая легко создавать фейковые данные для тестирования. Преимущества использования библиотеки Bogus включают:</p>
	<p>1. Простота использования и настройка.</p>
	<p>2. Возможность генерации данных различных типов, таких как имена, адреса, даты.</p>
	<p>3. Поддержка сложных структур данных и зависимостей между ними.</p>
	<p>4. Генерация данных, соответствующих различным культурам и локальным привязанностям.</p>
	<p>Проект представляет собой набор тестовых сценариев для оценки производительности операций вставки, выборки, обновления и удаления данных при использовании двух подходов к доступу к данным: Entity Framework и Dapper. Вот краткое описание каждого файла тестирования:</p>
	<p>1. Program.cs: этот файл содержит точку входа в приложение. Он настраивает и запускает тестовые сценарии с использованием библиотеки BenchmarkDotNet.</p>
	<p>2. InsertTest.cs: этот файл содержит тесты для оценки производительности операций вставки данных. Он сравнивает подходы EF и Dapper как для одиночной вставки, так и для вставки множества записей.</p>
	<p>3. SelectTest.cs: в этом файле проводятся тесты для оценки производительности операций выборки данных. Он сравнивает различные способы выборки записей, такие как поиск по ID, фильтрация по имени.</p>
	<p>4. SearchTest.cs: этот файл содержит тесты для оценки производительности операций поиска данных. Он сравнивает различные способы поиска записей по критериям, таким как совпадение, начало строки, содержание.</p>
	<p>5. FunctionsTest.cs: здесь проводятся тесты для оценки производительности дополнительных функций, предоставляемых EF и Dapper, таких как подсчет записей и постраничный запрос.</p>
	<p>6. UpdateTest.cs: этот файл содержит тесты для оценки производительности операций обновления данных. Он сравнивает различные способы обновления записей через EF и Dapper.</p>
	<p>7. DeleteTest.cs: здесь проводятся тесты для оценки производительности операций удаления данных. Он сравнивает различные способы удаления записей через EF и Dapper.</p>
	<p>С помощью данных тестов мы определим, какой из двух подходов (EF или Dapper) будет наиболее эффективным для конкретных операций с базой данных в проекте. Использование BenchmarkDotNet обеспечивает надежное и объективное сравнение производительности различных реализаций кода.</p>
	<p>Для проведения тестов производительности между Entity Framework и Dapper был разработан набор тестовых сценариев, оценивающих основные операции с базой данных. Тестирование проводилось с использованием библиотеки BenchmarkDotNet, настроенной для детального отслеживания использования памяти, потоков и профилирования ETW (Event Tracing for Windows).</p>
	<p>Тесты проводились на машине со следующими характеристиками:</p>
	<p>1. Процессор: Intel Core i5-8365U.</p>
	<p>2. Оперативная память: 16 GB DDR4.</p>
	<p>3. Операционная система: Windows 11.</p>
	<p>Использовалась среда разработки Visual Studio 2022, а в качестве базы данных – Microsoft SQL Server 2019.</p>
	<p>Для получения детальной информации о производительности использовались следующие инструменты:</p>
	<p>1. MemoryDiagnoser: для отслеживания использования памяти.</p>
	<p>2. ThreadingDiagnoser: для отслеживания работы потоков.</p>
	<p>3. EtwProfiler: для профилирования событий ETW.</p>
	<p>Были проведены тесты на вставку одной и множества записей в базу данных. Для каждой операции были разработаны тесты как для EF, так и для Dapper. Вот пример кода для тестирования вставки одной записи (листинг 1).</p>
	<p>[Benchmark(Description = &quot;EF Одиночная вставка&quot;)]</p>
	<p>public async Task InsertEF()</p>
	<p>{</p>
	<p>    var student = StudentDataProvider.GetStudentEF();</p>
	<p>    await context.AddAsync(student);</p>
	<p>    await context.SaveChangesAsync();</p>
	<p>}</p>
	<p> [Benchmark(Description = &quot;DP Одиночная вставка&quot;)]</p>
	<p>public async Task InsertDP()</p>
	<p>{</p>
	<p>    var student = StudentDataProvider.GetStudentDP();</p>
	<p>    await connection.InsertAsync(student);</p>
	<p>}</p>
	<fig id="F1">
		<label>Figure 1</label>
		<caption>
			<p>Результат сценария InsertTest</p>
		</caption>
		<alt-text>Результат сценария InsertTest</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/fd6446e1-d788-4233-a216-08c6611a2535.png"/>
	</fig>
	<p>Результат выполнения операции ввода вставки в таблицу базы данных на рисунке 1.Для тестирования выборки данных были разработаны тесты, которые включают одиночный выбор по ID, фильтрацию по имени и получение всех записей. Пример кода одиночного выбора по ID (листинг 2).</p>
	<p>[Benchmark(Description = &quot;EF Одиночный поиск&quot;)]</p>
	<p>public async Task EF_Select_Student_By_Id_Linq()</p>
	<p>{</p>
	<p>    int id = GetRandomId();</p>
	<p>    await context.Students.FindAsync(id);</p>
	<p>}</p>
	<p> [Benchmark(Description = &quot;DP Одиночный поиск&quot;)]</p>
	<p>public async Task DP_Select_Student_By_Id_Linq()</p>
	<p>{</p>
	<p>    int id = GetRandomId();</p>
	<p>    await connection.GetAsync&lt;Student&gt;(id);</p>
	<p>}</p>
	<fig id="F2">
		<label>Figure 2</label>
		<caption>
			<p>Результат сценария SelectTest</p>
		</caption>
		<alt-text>Результат сценария SelectTest</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/1490bcee-d531-472f-bb29-2c4dc6388b88.png"/>
	</fig>
	<p>Результат выполнения операции выбора из таблицы базы данных указано на рисунке 2.Для операций поиска были разработаны тесты на подсчет записей, начинающихся с определенной буквы, содержащих определенную букву и записей в диапазоне дат (листинг 3).</p>
	<p>[Benchmark(Description = &quot;DP Подсчет количества записей между датами&quot;)]</p>
	<p>public async Task SearchDateTimeDP()</p>
	<p>{</p>
	<p>    await connection.CountAsync&lt;Student&gt;(i =&gt; i.BirthDate &gt;= startDateTime &amp;&amp; i.BirthDate &lt;= endDateTime);</p>
	<p>}</p>
	<p>[Benchmark(Description = &quot;EF Подсчет количества записей между датами&quot;)]</p>
	<p>public async Task SearchDateTimeEF()</p>
	<p>{</p>
	<p>    await context.Students.CountAsync(i =&gt; i.BirthDate &gt;= startDateTime &amp;&amp; i.BirthDate &lt;= endDateTime);</p>
	<p>}</p>
	<fig id="F3">
		<label>Figure 3</label>
		<caption>
			<p>Результат сценария SearchTest</p>
		</caption>
		<alt-text>Результат сценария SearchTest</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/77721efb-ccb9-4b7b-aaf3-1da428336157.png"/>
	</fig>
	<p>Результат выполнения операции поиска из таблицы базы данных указано на рисунке 3.Были проведены тесты на обновление записей как с использованием EF, так и с использованием Dapper (листинг 4).</p>
	<p>[Benchmark(Description = &quot;DP Обновление записи&quot;)]</p>
	<p>public async Task UpdateSingleDP()</p>
	<p>{</p>
	<p>    var user = GetRandomStudent();</p>
	<p>    user.FirstName = user.FirstName.ToUpper();</p>
	<p>    await connection.UpdateAsync(user);</p>
	<p>}</p>
	<p> [Benchmark(Description = &quot;EF Обновление записи&quot;)]</p>
	<p>public async Task UpdateSingleEF()</p>
	<p>{</p>
	<p>    var user = GetRandomStudent();</p>
	<p>    user.FirstName = user.FirstName.ToUpper();</p>
	<p>    context.Update(user);</p>
	<p>    await context.SaveChangesAsync();</p>
	<p>}</p>
	<fig id="F4">
		<label>Figure 4</label>
		<caption>
			<p>Результат сценария UpdateTest</p>
		</caption>
		<alt-text>Результат сценария UpdateTest</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/b7434486-3ddf-4f1b-a5b5-5c9894666ec4.png"/>
	</fig>
	<p>Результат выполнения операции обновление записей таблицы в базы данных указано на рисунке 4.Были проведены тесты на удаление записей (листинг 5).</p>
	<p>[Benchmark(Description = &quot;DP Удаление&quot;)]</p>
	<p>public async Task DeleteSingleDP()</p>
	<p>{</p>
	<p>    var student = GetRandomStudent();</p>
	<p>    await connection.DeleteAsync(student);</p>
	<p>}</p>
	<p> [Benchmark(Description = &quot;EF Удаление&quot;)]</p>
	<p>public async Task DeleteSingleEF()</p>
	<p>{</p>
	<p>    var student = GetRandomStudent();</p>
	<p>    context.Students.Remove(student);</p>
	<p>    await context.SaveChangesAsync();</p>
	<p>}</p>
	<fig id="F5">
		<label>Figure 5</label>
		<caption>
			<p>Результат сценария DeleteTest</p>
		</caption>
		<alt-text>Результат сценария DeleteTest</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/b24c9595-4fa5-467e-9d59-392bb055f505.png"/>
	</fig>
	<p>Результат выполнения операции удаление записей таблицы в базы данных указано на рисунке 5.Расшифровка столбцов таблицы результатов:</p>
	<p>1. Method: наименования методов тестирования.</p>
	<p>2. Mean: среднее время выполнения операций в миллисекундах.</p>
	<p>3.Error: возможное отклонение среднего значения.</p>
	<p>4. StdDev: стандартное отклонение времени выполнения.</p>
	<p>5. Median: медианное время выполнения.</p>
	<p>6. Min: минимальное время выполнения.</p>
	<p>7. Max: максимальное время выполнения.</p>
	<p>8. Allocated: объем памяти, выделенный для выполнения операций.</p>
	<p>9. insertRowCount: количество строк, которые были вставлены в таблицу.</p>
	<p>В ходе проведения тестов с использованием библиотеки BenchmarkDotNet было использовано EtwProfiler для получения результата анализа нагрузку на процессор. Данные профилирования выводились в папку \src\ConsoleApp\bin\Release\net8.0\BenchmarkDotNet.Artifacts.Результирующие файлы:</p>
	<p>1. DeleteSingleDP.etl.</p>
	<p>2. DeleteSingleEF.etl.</p>
	<p>3. DeleteSingleDPRaw.etl.</p>
	<p>4. DeleteSingleEFRaw.etl.</p>
	<p>5. UpdateSingleDP.etl.</p>
	<p>6. UpdateSingleEF.etl.</p>
	<p>7. UpdateSingleDPRaw.etl.</p>
	<p>8. UpdateSingleEFRaw.etl.</p>
	<fig id="F6">
		<label>Figure 6</label>
		<caption>
			<p>Результат сценария DeleteSingleDP</p>
		</caption>
		<alt-text>Результат сценария DeleteSingleDP</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/ee58ac62-47f7-4372-8ec8-473555e53565.png"/>
	</fig>
	<fig id="F7">
		<label>Figure 7</label>
		<caption>
			<p>Результат сценария DeleteSingleEF</p>
		</caption>
		<alt-text>Результат сценария DeleteSingleEF</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/fe5d6b65-9a79-4068-8d93-c0c9be3e8544.png"/>
	</fig>
	<fig id="F8">
		<label>Figure 8</label>
		<caption>
			<p>Результат сценария DeleteSingleDPRaw</p>
		</caption>
		<alt-text>Результат сценария DeleteSingleDPRaw</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/be1dbf98-ee04-4ff4-8963-22671d91a1bd.png"/>
	</fig>
	<fig id="F9">
		<label>Figure 9</label>
		<caption>
			<p>Результат сценария DeleteSingleEFRaw</p>
		</caption>
		<alt-text>Результат сценария DeleteSingleEFRaw</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/0ce4ed1b-4ad0-489c-b348-bb9e395a99a5.png"/>
	</fig>
	<fig id="F10">
		<label>Figure 10</label>
		<caption>
			<p>Результат сценария UpdateSingleDP</p>
		</caption>
		<alt-text>Результат сценария UpdateSingleDP</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/18778674-fbe4-4b7a-b670-1dad088b4363.png"/>
	</fig>
	<fig id="F11">
		<label>Figure 11</label>
		<caption>
			<p>Результат сценария UpdateSingleEF</p>
		</caption>
		<alt-text>Результат сценария UpdateSingleEF</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/6e039366-4211-4ff2-9625-9e112f3e4367.png"/>
	</fig>
	<fig id="F12">
		<label>Figure 12</label>
		<caption>
			<p>Результат сценария UpdateSingleDPRaw</p>
		</caption>
		<alt-text>Результат сценария UpdateSingleDPRaw</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/a9776093-9258-4fb7-8944-aca611aa9423.png"/>
	</fig>
	<fig id="F13">
		<label>Figure 13</label>
		<caption>
			<p>Результат сценария UpdateSingleEFRawpng</p>
		</caption>
		<alt-text>Результат сценария UpdateSingleEFRawpng</alt-text>
		<graphic xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/media/images/2024-09-26/52dd3b10-cb00-4f6b-80d1-e9fbf92eb602.png"/>
	</fig>
	<p>На рисунках c 6 по 13 представлены результаты тестов, демонстрирующие нагрузку процессора при выполнении операций удаления и обновления записей с использованием Dapper и Entity Framework:Как видно из результатов, при использовании Dapper нагрузка на процессор в среднем по операциям нагрузка на процессор ниже по сравнению с использованием Entity Framework. Это связано с несколькими ключевыми факторами:</p>
	<p>1. Более низкий уровень абстракции: Dapper является микро ORM и работает напрямую с SQL-запросами, что позволяет избежать накладных расходов, связанных с обработкой запросов на более высоком уровне абстракции, как это делает EF.</p>
	<p>2. Меньше генерации SQL: Dapper использует заранее подготовленные SQL-запросы или непосредственно переданные строки SQL, что уменьшает нагрузку на процессор при генерации запросов.</p>
	<p>3. Оптимизация выполнения запросов: Dapper использует простую и эффективную обработку результатов запросов, что уменьшает общую нагрузку на процессор по сравнению с более сложной обработкой данных в EF.</p>
	<p>4. Минимизация внутренней логики: Dapper фокусируется на минималистичной логике взаимодействия с базой данных, избегая сложных механизмов трекинга изменений и прочих дополнительных функций, которые присутствуют в EF.</p>
	<p>Эти особенности делают Dapper более производительным инструментом для выполнения операций, таких как вставка, обновление и удаление записей в базе данных, особенно в сценариях, где важна производительность и минимальная нагрузка на процессор.</p>
	<p>5. Разработка рекомендаций</p>
	<p>Выбор между Dapper и Entity Framework зависит от множества факторов, таких как требования к производительности, сложность бизнес-логики, удобство разработки, а также опыт и предпочтения команды разработчиков. Рассмотрим более детально случаи, когда целесообразно использовать каждый из этих инструментов.</p>
	<p>Dapper, благодаря своей легковесности, показывает значительно меньшую нагрузку на процессор по сравнению с EF в тестах. Это делает его оптимальным выбором для приложений, где производительность является критически важным фактором. Высокая скорость выполнения Dapper достигается за счет отсутствия накладных расходов, связанных с генерацией SQL-запросов и отслеживанием изменений, характерных для EF. Этот инструмент предоставляет разработчикам возможность писать собственные SQL-запросы, обеспечивая полный контроль над их выполнением, что особенно важно при оптимизации сложных запросов и использовании специфичных для базы данных функций. В отличие от EF, который генерирует SQL-запросы на основе LINQ [11], Dapper использует заранее подготовленные SQL-запросы, что минимизирует накладные расходы и ускоряет выполнение операций. Это делает его идеальным для выполнения простых операций CRUD (вставка, обновление, удаление, выборка). Если приложение в основном выполняет такие операции, использование Dapper может быть более эффективным и рациональным выбором. Дополнительно, Dapper легко интегрируется в проект и требует минимального объема кода для выполнения базовых операций с базой данных.</p>
	<p>Для обработки больших объемов данных, где требуется высокая производительность, Dapper предлагает значительные преимущества. Его архитектура позволяет более эффективно масштабировать приложение, так как он работает ближе к низкоуровневым механизмам доступа к данным, обеспечивая минимальные накладные расходы и более быструю обработку данных.</p>
	<p>С другой стороны, Entity Framework предоставляет более высокий уровень абстракции, что позволяет разработчикам работать с объектами домена вместо написания SQL-запросов вручную. Это существенно упрощает разработку, делает код более читаемым и легко поддерживаемым. EF особенно полезен в тех случаях, когда требуется автоматическое управление сложными отношениями между сущностями, такими как один-к-одному, один-ко-многим и многие-ко-многим. Он обеспечивает встроенные механизмы отслеживания изменений, которые автоматически генерируют соответствующие SQL-запросы для сохранения изменений в базе данных. Кроме того, EF поддерживает ленивую загрузку данных, что позволяет загружать связанные данные только по мере необходимости, оптимизируя использование памяти и повышая производительность приложения.</p>
	<p>Использование LINQ в EF упрощает написание и чтение запросов, поскольку LINQ-запросы компилируются в SQL-запросы, обеспечивая интеграцию с базой данных без необходимости написания SQL-кода. Автоматическая генерация SQL-запросов на основе выражений LINQ и модели данных снижает вероятность ошибок и ускоряет процесс разработки.</p>
	<p>Если команда разработчиков уже обладает значительным опытом работы с EF, его использование может быть более продуктивным, так как существующие знания и наработки могут сократить время на обучение и внедрение новых решений. Кроме того, EF предоставляет удобные средства для автоматического управления миграциями базы данных, что упрощает процесс обновления схемы базы данных при изменении модели данных.</p>
	<p>6. Заключение</p>
	<p>Проведенное исследование подтвердило значимость правильного выбора ORM технологии для обеспечения высокой производительности приложений, работающих с базами данных. Сравнительный анализ Dapper и Entity Framework продемонстрировал, что каждая из этих технологий обладает своими преимуществами и недостатками, которые могут быть критическими в зависимости от специфики проекта.</p>
	<p>Dapper показал высокую производительность, особенно в операциях с минимальными накладными расходами на процессор и память. Это делает его предпочтительным выбором для приложений, где критически важны скорость выполнения запросов и низкие затраты на ресурсы, таких как высоконагруженные системы с большими объемами данных. Его простота и эффективность при выполнении CRUD операций делают его оптимальным выбором для сценариев, где требуется минимизация времени отклика системы.</p>
	<p>С другой стороны, Entity Framework предоставляет более высокий уровень абстракции и автоматизации, что значительно упрощает разработку сложных приложений с богатой бизнес-логикой. EF особенно полезен в проектах, где требуется работа с объектами домена и сложными отношениями между сущностями. Возможности автоматического управления миграциями базы данных и интеграция с LINQ позволяют ускорить разработку и повысить читаемость и поддерживаемость кода.</p>
	<p>Таким образом, выбор между Dapper и Entity Framework должен основываться на конкретных требованиях проекта. Dapper подходит для случаев, когда производительность и минимальные накладные расходы являются приоритетными, тогда как Entity Framework является предпочтительным для проектов, где важны удобство разработки, автоматизация и поддержка сложных отношений между данными.</p>
	<p>Результаты данного исследования могут быть полезны для разработчиков и архитекторов, которые принимают решения о выборе ORM технологии для своих проектов, обеспечивая оптимальный баланс между производительностью, удобством разработки и поддерживаемостью кода. </p>
</sec>
        <sec sec-type="supplementary-material">
            <title>Additional File</title>
            <p>The additional file for this article can be found as follows:</p>
            <supplementary-material id="S1" xmlns:xlink="http://www.w3.org/1999/xlink"
                                    xlink:href="https://doi.org/10.5334/cpsy.78.s1">
                <!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/14926.docx">14926.docx</inline-supplementary-material>]-->
                <!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/14926.pdf">14926.pdf</inline-supplementary-material>]-->
                <label>Online Supplementary Material</label>
                <caption>
                    <p>Further description of analytic pipeline and patient demographic information. DOI:
                        <italic>
                            <uri>https://doi.org/10.60797/IRJ.2024.148.145</uri>
                        </italic>
                    </p>
                </caption>
            </supplementary-material>
        </sec>
    </body>
    <back>
        <ack>
            <title>Acknowledgements</title>
            <p>None</p>
        </ack>
        <sec>
            <title>Competing Interests</title>
            <p>None</p>
        </sec>
        <ref-list>
            <ref id="B1">
                    <label>1</label>
                    <mixed-citation publication-type="confproc">
                        Савельев А.Г. Анализ эффективности использования графических процессоров для ускорения обработки SQL-запросов / А.Г. Савельев, И.С. Вершинин, Р.Ф. Гибадуллин // Информационные технологии и нанотехнологии (ИТНТ-2017) : сборник трудов III международной конференции и молодежной школы, Самара, 25—27 апреля 2017 года / Самарский национальный исследовательский университет имени академика С.П. Королева. — Самара: Новая техника, 2017. — С. 1672–1675.
                    </mixed-citation>
                </ref><ref id="B2">
                    <label>2</label>
                    <mixed-citation publication-type="confproc">
                        Ямалеева Г.Н. Оптимизация исполнения SQL-запросов к базам данных под управлением MySQL / Г.Н. Ямалеева, М.Ю. Перухин, Р.Ф. Гибадуллин // Информационные технологии и математическое моделирование (ИТММ-2017) : Материалы XVI Международной конференции имени А.Ф. Терпугова, Казань, 29 сентября — 03 октября 2017 года. — Казань: Издательство научно-технической литературы, 2017. — Т. 2. — С. 239–241.
                    </mixed-citation>
                </ref><ref id="B3">
                    <label>3</label>
                    <mixed-citation publication-type="confproc">
                        Гибадуллин Р.Ф. Ускорение обработки SQL-запросов к базам данных на GPU посредством аппаратно-программной платформы NVIDIA CUDA / Р.Ф. Гибадуллин, А.Г. Савельев, М.Ю. Перухин // Вестник Технологического университета. — 2016. — Т. 19. — № 20. — С. 110–116.
                    </mixed-citation>
                </ref><ref id="B4">
                    <label>4</label>
                    <mixed-citation publication-type="confproc">
                        Отинчиев А.К. Использование Dapper C# в программировании / А.К. Отинчиев, Л.Г. Касенова // Актуальные вопросы технических наук : материалы V Международной научной конференции, Санкт-Петербург, 20—23 февраля 2019 года. — Санкт-Петербург: Свое издательство, 2019. — С. 5–8.
                    </mixed-citation>
                </ref><ref id="B5">
                    <label>5</label>
                    <mixed-citation publication-type="confproc">
                        Макаров О.С. Краткий обзор технологии Entity Framework / О.С. Макаров // Наукосфера. — 2020. — № 7. — С. 125–128.
                    </mixed-citation>
                </ref><ref id="B6">
                    <label>6</label>
                    <mixed-citation publication-type="confproc">
                        Оганнесян Д.А. Работа с хранилищами данных в Microsoft SQL Server / Д.А. Оганнесян, Е.И. Чигарина // Перспективные информационные технологии (ПИТ 2019) : Труды Международной научно-технической конференции, Самара, 24—26 июня 2019 года / Под ред. С.А. Прохорова. — Самара: Самарский научный центр РАН, 2019. — С. 81–83.
                    </mixed-citation>
                </ref><ref id="B7">
                    <label>7</label>
                    <mixed-citation publication-type="confproc">
                        Судник О.А. Использование технологии ORM в работе с базами данных на языках программирования высокого уровня / О.А. Судник, Н.И. Белодед // Технологические инновации и научные открытия : Сборник научных статей по материалам XV Международной научно-практической конференции, Уфа, 17 мая 2024 года. — Уфа: Вестник науки, 2024. — С. 605–608.
                    </mixed-citation>
                </ref><ref id="B8">
                    <label>8</label>
                    <mixed-citation publication-type="confproc">
                        Khan O.M.A. C# 7 and. NET Core 2.0 High Performance: Build highly performant, multi-threaded, and concurrent applications using C# 7 and. NET Core 2.0 / O.M.A. Khan. — Packt Publishing Ltd, 2018.
                    </mixed-citation>
                </ref><ref id="B9">
                    <label>9</label>
                    <mixed-citation publication-type="confproc">
                        Chakraborty S. CRUD Operation on WordPress Database Using C# SQL Client / S. Chakraborty, P.S. Aithal // International Journal of Case Studies in Business, IT, and Education. — 2023. — P. 138–149. — DOI: 10.47992/ijcsbe.2581.6942.0313.
                    </mixed-citation>
                </ref><ref id="B10">
                    <label>10</label>
                    <mixed-citation publication-type="confproc">
                        Assi M.J. Root Cause Analysis And Improvement In Windows System Based On Windows Performance Toolkit WPT / M.J. Assi, A.A. Fahad, B. Al-Sarray // Iraqi Journal of Science. — 2022. — P. 5046–5057. — DOI: 10.24996/ijs.2022.63.11.39.
                    </mixed-citation>
                </ref><ref id="B11">
                    <label>11</label>
                    <mixed-citation publication-type="confproc">
                        Кузнецов А.С. Исследование технологии доступа к данным LINQ to SQL / А.С. Кузнецов, И.Ю. Балашова // Информационные ресурсы и системы в экономике, науке и образовании : Сборник статей VII Международной научно-практической конференции, Пенза, 27—28 апреля 2017 года. — Пенза: Приволжский Дом знаний, 2017. — С. 41–45.
                    </mixed-citation>
                </ref>
        </ref-list>
    </back>
    <fundings>
        
    </fundings>
</article>