ASP.NET Web API — це чудова технологія. Писати веб-API настільки просто, що багато розробників не витрачають час на структурування своїх додатків для отримання якісної продуктивності виконання. У цій статті я розгляну 8 технік для покращення продуктивності ASP.NET веб-API. 1) Використовуйте найшвидший інструмент серіалізації JSON Серіалізація JSON має критичний вплив на продуктивність усього ASP.NET Web API. В одному з моїх проєктів я перейшов з серіалайзера JSON.NET на ServiceStack.Text протягом півтора року. Я виміряв, що продуктивність Web API покращилася приблизно на 20%. Дуже рекомендую спробувати цей інструмент серіалізації. Ось деякі нещодавні порівняльні дані щодо продуктивності популярних інструментів серіалізації.
SerializerPerformanceGraf Джерело: theburningmonk Оновлення: Схоже, що StackOverflow використовує Jil, їхній заявлений інструмент серіалізації JSON. Тестові дані можна знайти на їхній GitHub сторінці Jil serializer. 2) Ручне серіалізування JSON з DataReader Я використовував цей підхід у своїх проєктах і отримував пільги за продуктивність. Ви можете вручну створювати JSON-рядки з DataReader і уникати зайвого створення об'єктів, щоб не брати значення з DataReader і записувати в об'єкти, потім брати значення з цих об'єктів і використовувати JSON Serializer для генерації JSON. Використовуйте StringBuilder для генерації JSON і повернення StringContent наприкінці як вміст відповіді у WebAPI.
- var response = Request.CreateResponse(HttpStatusCode.OK);
- response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
- return response;
Копія коду Більше способів зробити це ви можете знайти на блозі Ріка Страла 3) Використовувати інші формати протоколів (буфер протоколу, пакет повідомлень) якомога більше Якщо ви можете використовувати інші формати повідомлень у своєму проєкті, такі як Protocol Buffers або MessagePacks, замість використання JSON. Ви отримаєте величезну перевагу в продуктивності не лише тому, що буфери протоколу дуже швидкі у серіалізації, а й тому, що вони форматуються швидше, ніж JSON, у отриманих результатах. 4) Реалізувати стиснення Використовуйте GZIP або Deflate у вашому ASP.NET веб-API. Стиснення — це простий і ефективний спосіб зменшити розмір і чутливість пакетів відповіді. Це дуже необхідна функція, ви можете ознайомитися з іншими статтями про стиснення у моєму блозі ASP.NET Web API GZip compression ActionFilter з 8 рядками коду. 5) Використання кешування Використання кешування вихідних даних у методі Web API є глибоким. Наприклад, якщо велика кількість користувачів отримує доступ до контенту-відповіді, це змінюється лише раз на день. Якщо ви хочете реалізувати ручне кешування, наприклад, кешувати паролі користувачів у пам'ять, дивіться мій блог-пост «Простий спосіб реалізувати кешування у ASP.NET Web API». 6) Використовуйте типові ADO.NET, коли це можливо Ручний ADO.NET все ще найшвидший спосіб отримати значення з бази даних. Якщо продуктивність ваших веб-API для вас дуже важлива, тоді не використовуйте ORM. Ви можете побачити порівняння продуктивності найпопулярніших ORM. ORMMapper
Dapper і рукописний код для завантаження швидкі, і справді, всі ORM повільніші за три. LLBLGen з кешом набору результатів працює швидко, але потрібно повторно ітерувати набір результатів і знову інстанцювати об'єкт у пам'яті. 7) Впровадити асинхронний підхід у Web API Використання асинхронного веб-API сервісу суттєво збільшує кількість HTTP-запитів, які обробляють веб-API. Реалізація проста: просто використовуйте async ключове слово і змініть тип поверненого значення методу на Завдання.
- [HttpGet]
- public async Task OperationAsync()
- {
- await Task.Delay(2000);
- }
Копія коду 8) Повертає кілька наборів результатів і їх комбінації Зменшення кількості передач корисне не лише для кількох баз даних, а й для веб-API, які дозволяють використовувати потужність наборів результатів. Це означає, що ви можете витягти кілька наборів результатів із DataReader, дивіться наступний демо-код:
- // read the first resultset
- var reader = command.ExecuteReader();
- // read the data from that resultset
- while (reader.Read())
- {
- suppliers.Add(PopulateSupplierFromIDataReader( reader ));
- }
- // read the next resultset
- reader.NextResult();
- // read the data from that second resultset
- while (reader.Read())
- {
- products.Add(PopulateProductFromIDataReader( reader ));
- }
Копія коду Ви можете повертати кілька об'єктів в одній відповіді з веб-API, спробуйте об'єднати повернені об'єкти і повернути такі об'єкти:
- public class AggregateResult
- {
- public long MaxId { get; set; }
- public List<Folder> Folders{ get; set; }
- public List<User> Users{ get; set; }
- }
Копія коду Це зменшить кількість HTTP-запитів до вашого WEB API. Дякую, що прочитали цю статтю.
|