.NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試

来源:https://www.cnblogs.com/s0611163/archive/2022/09/20/16711330.html
-Advertisement-
Play Games

.NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試 開發環境 VS2022 .NET 6 測試環境 測試工具 介面壓力測試工具:JMeter 資料庫 MySQL 5.7 資料庫和WebApi服務在同一臺伺服器上,JMeter在本人筆記本上。 測試設置 200個線程併發,每個 ...


.NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試

開發環境

VS2022
.NET 6

測試環境

測試工具

介面壓力測試工具:JMeter

資料庫

MySQL 5.7
資料庫和WebApi服務在同一臺伺服器上,JMeter在本人筆記本上。

測試設置

200個線程併發,每個線程迴圈50次,共10000次請求。

介面代碼

模糊查詢、排序、分頁查詢第10頁200條數據,參數化查詢條件。

EFCore (第一輪請求),測試結果

服務程式部署到測試伺服器上測試,連接MySql資料庫。

吞吐量

只有200多

每個請求響應時間

最長5秒多

EFCore (第一輪請求結束後,20秒內進行第二輪請求),測試結果

服務程式部署到測試伺服器上測試,連接MySql資料庫。
經過第一輪10000個請求的充分預熱,取第二輪10000個請求的測試結果。

吞吐量

1200多

每個請求響應時間

不到50毫秒

線程占用

最大達到143個線程

EFCore (第一輪請求結束後,20秒後進行第二輪請求),測試結果

吞吐量

1200

每次請求響應時間

100毫秒

線程占用

只有50多個線程

使用FactoryStartNew. StartNewThread

查詢代碼

FactoryStartNew. StartNewThread代碼


使用FactoryStartNew. StartNewThread (第一輪請求),測試結果

服務程式部署到測試伺服器上測試,連接MySql資料庫。

吞吐量

不到200

每個請求響應時間

最長33秒

使用FactoryStartNew. StartNewThread (第一輪請求結束後,20秒內進行第二輪請求),測試結果

吞吐量

1000多

每個請求響應時間

200毫秒以內

線程占用

高達260多個線程

使用FactoryStartNew. StartNewThread (第一輪併發請求結束後,20秒後進行第二輪請求),測試結果

吞吐量

只有200多

每個請求響應時間

最長達到了30秒
在等待創建線程,.NET預設線程池,1秒才增加一個線程

線程占用

高達230多個線程

對比SqlSugar

同樣的資料庫,同樣的數據,同樣的查詢,同樣的JMeter測試設置,同樣取第二輪測試結果。

吞吐量

395

每個請求響應時間

500毫秒

對比FreeSql

同樣的資料庫,同樣的數據,同樣的查詢,同樣的JMeter測試設置,同樣取第二輪測試結果。

吞吐量

408

每個請求響應時間

不到500毫秒

對比Dapper.LiteSql

吞吐量

480多

每個請求響應時間

400多毫秒

結論

1. EFCore優秀,吞吐量和響應時間都非常優秀。

2. 使用FactoryStartNew. StartNewThread,能用,但有問題。

3. 如果覺得自己的ORM沒問題,那就沒有問題了,誰沒事閑的做這種測試,慢一點不會死人,用戶多了併發多了就加機器,作者和用戶永遠也不會知道,明明可以達到1000的吞吐量,卻一直用的280吞吐量的ORM。

4. 比EFCore慢不丟人。

5. 不要說代碼怎麼寫的,我要看測試結果。

測試工程地址

https://gitee.com/s0611163/Net6WebApiPerformanceTest


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實時展示用戶上傳的頭像 總體思路 """ 1.首先需要給對應的上傳頭像input框綁定一個文本域變化事件 (當檢測到用戶對該文件框上傳了頭像就會觸發一系列操作) 2.再生成一個文件閱讀器對象 3.再獲取用戶上傳的文件頭像 4.把用戶上傳的文件頭像交給文件閱讀器對象FileReader讀取 5.利用文 ...
  • 1 垃圾收集三件事 哪些記憶體需要回收:死去的對象需要回收 什麼時候回收 如何回收 按照jvm記憶體區域劃分原則:程式計數器、虛擬機棧、本地方法棧3個區域的記憶體隨線程創建而劃分,因此線程結束時,記憶體也自動釋放。 本章節分析的是Java堆和方法區的記憶體管理策略 1、虛擬機棧、本地方法棧,棧中的棧幀隨著方法 ...
  • Python中,要想知道一個字元串有多少個字元(獲得字元串長度),或者一個字元串占用多少個位元組,可以使用len()函數。 語法格式: len(string) string 用於指定要進行長度統計的字元串 示例: a = 'www.baidu.com' print(len(a)) 輸出 13 在 Py ...
  • 二、散點圖 import seaborn as sns import matplotlib.pyplot as plt sns.set_theme(style = 'whitegrid') # 載入 diamonds 數據集 diamonds = sns.load_dataset('diamonds ...
  • 能對比測試 為了直觀地感受 Disruptor 有多快,設計了一個性能對比測試:Producer 發佈 1 億次事件,從發佈第一個事件開始計時,捕捉 Consumer 處理完所有事件的耗時。 測試用例在 Producer 如何將事件通知到 Consumer 的實現方式上,設計了兩種不同的實現: Pr ...
  • 學習網站: http://seaborn.pydata.org/examples/scatterplot_matrix.html 一、Anscombe's quartet(安斯庫姆四重奏) 1973年,統計學家F.J. Anscombe構造出了四組奇特的數據。它告訴人們,數據分析之前,描繪數據所對應 ...
  • 類型載入器設計(Type Loader Design) 原文:https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/botr/type-loader.md 作者: Ladi Prosek - 2007 翻譯:幾秋 (https ...
  • 最近在項目中啟用了Nullable 可為空的類型,這個特性確實很好用,在 WebAPI 的入參上可以直接採用 ? 來標記一個欄位是否允許為空,但是使用過程中遇到瞭如下一個問題,比如創建部門介面 我們定義入參模型如下: public class DtoDepartment { /// <summary ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...