.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
  • 一、openKylin簡介 openKylin(開放麒麟) 社區是在開源、自願、平等和協作的基礎上,由基礎軟硬體企業、非營利性組織、社團組織、高等院校、科研機構和個人開發者共同創立的一個開源社區,致力於通過開源、開放的社區合作,構建桌面操作系統開源社區,推動Linux開源技術及其軟硬體生態繁榮發展。 ...
  • 簡介 Flurl是一個用於構建基於HTTP請求的C#代碼的庫。它的主要目的是簡化和優雅地處理網路請求(只用很少的代碼完成請求)。Flurl提供了一種簡單的方法來構建GET、POST、PUT等類型的請求,以及處理響應和異常。它還提供了一些高級功能,如鏈式調用、緩存請求結果、自動重定向等。本文將介紹Fl ...
  • 一:背景 1. 講故事 最近也挺奇怪,看到了兩起 CPU 爆高的案例,且誘因也是一致的,覺得有一些代表性,合併分享出來幫助大家來避坑吧,閑話不多說,直接上 windbg 分析。 二:WinDbg 分析 1. CPU 真的爆高嗎 這裡要提醒一下,別人說爆高不一定真的就是爆高,我們一定要拿數據說話,可以 ...
  • 剛開始寫文章,封裝Base基類的時候,添加了trycatch異常塊,不過當時沒有去記錄日誌,直接return了。有小伙伴勸我不要吃了Exception 其實沒有啦,項目剛開始,我覺得先做好整體結構比較好。像是蓋樓一樣。先把樓體建造出來,然後再一步一步的美化完善。 基礎的倉儲模式已經ok,Autofa ...
  • 框架目標 什麼是框架,框架能做到什麼? 把一個方向的技術研發做封裝,具備通用性,讓使用框架的開發者用起來很輕鬆。 屬性: 通用性 健壯性 穩定性 擴展性 高性能 組件化 跨平臺 從零開始-搭建框架 建立項目 主鍵查詢功能開發 綁定實體 一步一步的給大家推導: 一邊寫一邊測試 從零開始--搭建框架 1 ...
  • 大家好,我是沙漠盡頭的狼。 本方首發於Dotnet9,介紹使用dnSpy調試第三方.NET庫源碼,行文目錄: 安裝dnSpy 編寫示常式序 調試示常式序 調試.NET庫原生方法 總結 1. 安裝dnSpy dnSpy是一款功能強大的.NET程式反編譯工具,可以對.NET程式進行反編譯,代替庫文檔的功 ...
  • 在`Windows`操作系統中,每個進程的虛擬地址空間都被劃分為若幹記憶體塊,每個記憶體塊都具有一些屬性,如記憶體大小、保護模式、類型等。這些屬性可以通過`VirtualQueryEx`函數查詢得到。該函數可用於查詢進程虛擬地址空間中的記憶體信息的函數。它的作用類似於`Windows`操作系統中的`Task... ...
  • 背景介紹 1,最近有一個大數據量插入的操作入庫的業務場景,需要先做一些其他修改操作,然後在執行插入操作,由於插入數據可能會很多,用到多線程去拆分數據並行處理來提高響應時間,如果有一個線程執行失敗,則全部回滾。 2,在spring中可以使用@Transactional註解去控制事務,使出現異常時會進行 ...
  • 線程(thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際 運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線 程並行執行不同的任務。 ...
  • 發現Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc} * * @since 21 */ @Override public StringBuilder ...