JMeter性能測試實現與分析分享

JMeter是由著名開源軟件巨頭Apache組織開發的純Java的壓力測試工具,它即能測試動態服務(WebService),也能測試靜態資源,包括Servlet服務、CGI腳本等,還能測試動態語言服務(PHP、Java、ASP.NET等)和數據庫和FTP服務,測試結束之后能夠根據測試的腳本配置和服務器配置情況,生成可視化的測試報告圖表。本文以測試基于HTTP請求的WebService服務為例進行講解。

1. 環境與配置
下載安裝

JMeter的使用十分簡單,下載之后,如果是Windows系統,運行bin目錄中的jmeter.bat即可,如果是UNIX-like系統,運行jmeter.sh即可。

另外,JMeter還支持以命令行方式運行。一般的命令方法是這樣的:

jmeter.sh -n -t test_plan.jmx -l output_log.jtl
-n 通知JMeter以非GUI方式運行
-t 指定將要運行的測試計劃,測試計劃本質上一個XML文件
-l 指定測試結果集輸出文件,這個文件本質上是一個CSV文件
如果以命令行方式運行,需要修改bin目錄中的jmeter.properties文件中的jmeterengine.force.system.exit這個選項,原因是以命令行方式運行時是無法對GUI窗口執行關閉操作的,這會導致UI線程永遠都不會退出,這種線程死鎖的情況會被JMeter認為是異常而報錯。
JMeter運行時會創建日志,對于未開啟UAC的Windows用戶,操作沒有任何影響,日志文件是保存在bin目錄中的,也就是說是和jmeter.bat文件保存在一起的,可是對已經開啟了UAC的用戶來說,如果選擇以管理員權限運行jmeter.bat,并且啟動了憑證驗證機制,那么日志文件將不會與jmeter.bat保存在一起,因為Windows下的bat文件是被cmd.exe(命令提示符,Windows的命令行Shell程序)所解析和執行的,而cmd.exe這個程序是在C:\Windows\System32這個目錄下的(我們假定你的系統安裝在C盤),所以啟動程序的進程上下文環境發生了變化,所以日志文件也會保存在C:\Windows\System32這個目錄中,更嚴重的,在某些情況下會因為CLASSPATH配置與JMeter運行環境出現不一致而導致找不到相應的Jar包,出現java.lang.ClassNotFoundException。事實上這個問題是可以被處理的,所以,可以認為這是jmeter.bat程序的一個BUG。

關于什么是UAC,官方有詳細介紹,請點擊這里查看,點擊這里還可以看到一個更簡單的介紹和說明。

環境要求

JMeter 3.0于今年5月中旬發布,與之前的版本不同,這個版本明確要求JDK 1.7以上版本的支持,推薦使用JDK1.8版本,并且這個版本的JMeter中使用的Apache HttpClient庫的版本也已經更新到了4.5.2。

如果用戶使用JMeter 2.10或者更早的版本,那么JMeter中集成的是HttpClient庫的3.1甚至更低的版本,此時如果被測試的Java請求是使用HttpClient庫的4.5及以上版本編譯的,那么運行時會出現莫名其妙的網絡錯誤,這是因為HttpClient庫的版本不兼容造成的,解決方法是在自己引用的Java請求中使用HttpClient3.1版本,和JMeter保持一致。然而推薦的方式是改用JMeter3.0以上版本,因為官方已經明確聲明自JMeter3.0起,HttpClient3.1的版本兼容性支持將被廢棄。

JMeter3.0以上版本提供了許多新功能,修復了性能上的幾個問題,而且HttpClient4.5以上版本也改進了一些功能,修復了退出時持久連接未關閉的BUG,改進了對HTTPS的支持。

2. 執行測試
幾個概念

測試計劃,也就是Test Plan,是整個測試任務管理的頂級單位,所有的對于測試任務的配置,都是放在測試計劃中的。這就好像一個根目錄一樣,所有的文件和數據,都是保存到這個根目錄之下的。

線程組,也就是Thread Group,是可以被獨立調試、執行和調度的獨立單元,一個測試計劃中可以有多個線程組,每個線程組可以配置并發用戶數、運行次數、并發加壓強度、定時任務等參數。
取樣器,也就是Sampler,是一個HTTP請求的所有邏輯關系承載,在這一個取樣器中,可以配置請求目標服務器的主域名、請求路徑、參數、請求頭信息、客戶端Cookie策略等。

監聽器,也就是Listener,是對測試過程和測試數據的收集機制,最常用的是聚合報告(Aggregate Report)和邏輯控制器,也就是Logic Controller,在這里可以配置多個取樣器的控制邏輯,比如我們通常都會有登錄服務只訪問一次,而數據服務或者查詢服務要訪問多次,此時可以通過只訪問一次登錄接口,然后根據需求對數據服務或者查詢服務進行壓力測試的方式完成。

配置元件,也就是Config Element,這里最常用的功能,是對HTTP請求的DNS策略、緩存策略、Cookies策略、Header信息、認證機制等信息進行配置,對于需要實現請求參數化的,還可以使用CSV Data Set Config功能。

配置任務

創建一個線程組,在TestPlan上點擊右鍵,選擇Add->Threads(Users)->Thread Group即可完成一個線程組的創建。

并發數:在Number of Threads(users)中設置,設置更多的用戶將需要更多的內存,一般情況下,如果并發數設置為1000,循環數設置為10,運行時需要的內存將會再700MB到1GB左右,在此數值之上時需要對JVM進行調優,否則有可能因為JVM或者測試機器性能問題導致測試數據不準確,甚至有可能導致JMeter無響應造成任務失敗。

集合點:在Ramp-Up Period(in seconds)中設置,這里可以控制加壓強度,這個設置項的意義是多少秒之內完成所有用戶的加壓,在此處設置一個恰當的值,再勾選設置項Scheduler,然后設置其中的Startup delay(seconds)選項即可完成集合點的設置。從而達到每n個用戶一起并發請求這樣的效果。

循環數:設置Loop Count即可,如果勾選了Forever,就是永遠運行,除非用戶手動停止。如果是在命令行上運行的測試計劃,并且啟用了這個選項,只能使用CTRL+C強行中止,如果任務是被使用類似于nohup這樣的方式運行在后臺的,只能強制殺死進程完成退出操作,不過這種方式下不用擔心測試數據丟失,因為JMeter對測試數據的輸出和保存是實時的。

檢查點:設置檢查點之前,需要先為線程組添加一個取樣器,我們以HTTP Sampler為例,在線程組上點擊右鍵,選擇Add->Sampler->HTTP Request即可,取樣器添加完成之后,需要先對此取樣器設置主域名,訪問路徑,內容編碼,超時時間、提交參數等諸多信息和參數。配置完成之后,在此取樣器上點擊右鍵,選擇Add->Assertion->Response Assertion,然后對這個響應斷言進行設置,它支持Contains(包含)、Matches(匹配)、Substring(子字符串)、Not(非運算)四種方式。特別的,我們不需要對Patterns to Test中的內容進行字符轉義。

參數化:待完善。

配置其他測試選項,最常用的其他測試選項,是HTTP Request的頭信息,通過這個功能可以設置HTTP請求提交時的Header信息和參數,設置方法是在取樣器上點擊Add->Config Element->HTTP Header Manager,然后就可以添加一個HTTP頭信息管理器,然后添加若干參數用于提交HTTP請求時提交到服務器。

執行測試

單個執行:在線程組上,點擊右鍵,選擇Start,即可按照此線程組設置的并發數的循環數啟動此線程組進行測試。

驗證執行:這個功能是JMeter3.0之后才有的功能,在線程組上,點擊右鍵,選擇Validate即可運行一次,無論并發數和循環數是多少,只運行一次,可以在修改參數之后快速驗證此線程組是否正確。

部分執行:當一個測試計劃中有多個線程組的時候,可以按住CTRL鍵單個選擇或取消選擇,也可以按住SHIFT鍵連續選擇多個線程組,選擇了自己想要執行的線程組之后,在被選擇的多個線程組的任意一個上點擊右鍵,選擇Start即可執行被選擇的線程組,這些線程組會按設置的所有參數立即啟動。

全量執行:在測試計劃上點擊左鍵選中它,然后點擊命令欄的Start按鈕,或者菜單Run->Start命令,或者按下CTRL+R快捷鍵,都會立即啟動整個測試計劃下的所有線程組開始執行測試任務。
服務器監控

先介紹幾個最常用的服務器狀態監控工具:

top Linux自帶的經典的系統性能情況查看工具

htop 這是一個第三方工具,用C語言寫成,需要下載、編譯和安裝,是top命令的改進版本,功能十分強大,視覺效果很好

glances,這是類似于htop的一個工具,使用Python寫成,需要Python3.4以上版本的支持,通過Python的pip3即可一鍵完成安裝,和htop一樣,功能強大、視覺效果很好

free Linux自帶的命令,用于查看內存狀態

vmstat Linux組件,用于快速查看系統的性能狀態信息

nmon 這是一個第三方工具,綠色免安裝,使用C語言寫成,它的原理是輪詢和收集/proc下的系統運行信息,然后進行分析整理,所以需要nmonChart的配合,可以生成十分直觀和漂亮的性能圖表,并且通過配置可以實現動態分析和在線查看。老版本的nmon會生成一個帶有VB宏的Excel文檔,然后下載下來之后必須使用Excel打開并且必須啟用宏功能,這種方式既不安全也很麻煩,已經被淘汰了。

iftop 這是一個第三方工具,需要下載并且編譯安裝才能使用,iftop工具最新版本0.17的安裝文件中對依賴包沒有處理,所以如果編譯失敗,需要我們手動檢查libpcap、libpcap-devel、ncurses、ncurses-devel這幾個依賴包是否正確安裝,安裝完畢直接輸入iftop即可啟動,可以非常直觀地看到網絡設備的連接速度情況。

分析結果

基礎分析和查看,要想快速查看測試任務執行情況,需要對每一個取樣器都配置結果樹和斷言結果,操作方法很簡單,在取樣器上點擊右鍵,選擇Add->Listener->Assertion Result即可添加一個斷言結果,這種情況下對每一次請求結果的斷言檢查是否成功,會立即看到,當然,如果斷言失敗,這條測試用例也就失敗了。添加結果樹的方法同樣簡單,在取樣器上點擊右鍵,選擇Add->Listner->View Results Tree即可,添加結果查看器的好處很多,可以看到取樣器的每一次請求的提交參數、時間等所有信息以及響應結果,便于深入細致的分析測試執行情況和成功與失敗的原因。

綜合查看,綜合查看結果,需要添加聚合報告,操作方法是在線程組中點擊右鍵,選擇Add->Listner->Aggregate Report,添加聚合報告的好處是能夠查看到此線程組下的所有取樣器的執行次數,平時時間、中值時間、最大時間、最小時間、失敗率、吞吐量等非常實用的測試數據。

3. 其他細節問題
1)將測試結果保存到Excel表格

Excel表格具有非常強大的數據分析和統計匯總能力,將海量的測試數據導出到Excel表格是非常實用的,操作很簡單,在線程組上點擊右鍵,選擇Add->Listner->View Results in Table,然后在Write results to file /Read from file中的Filename中填入一個指定的文件名即可,文件的擴展名最好是CSV,這樣可以直接使用Excel打開。

2)全局分析

有多個線程組時,逐個分析比較麻煩,也不利于效率提升,只需要在TestPlan上點擊右鍵,選擇Add->Listner->Aggregate Report,即可對整個測試計劃的所有線程組的測試執行情況一目了然,非常方便和實用,對于測試結果集,還可以點擊Save Table Data將它保存到CSV文件中,然后直接用Excel打開,可以很快的自動轉換成十分漂亮的圖表。

4. 橫向對比
1) 與Apache HTTP Server的ab工具對比
不同之處

ab工具對配置HTTP請求頭狀態、GET參數、POST提供數據和PUT提交文件,操作不夠直觀

ab工具對HTTPS的支持,需要單獨編譯的版本,默認的版本是不支持的,而ab工具并不能單獨編譯,因為它使用了Apache Portable Runtime(APR,可移植運行時庫)中的源碼,所以需要將整個Apache HTTP Server全部下載下來并且配置環境才能完成編譯,使用門檻較高。

ab工具僅支持命令行模式,JMeter同時支持GUI模式和命令行模式,但是GUI模式需要消耗更多資源

ab工具效率和性能比JMeter高很多,所以對測試任務機要求低

ab工具的最大請求數不能超過50000

參數化、集合點、檢查點這幾大功能方面,JMeter要比ab工具強大的多

相同之處

都可以對測試結果生成CSV文件

都可以很方便的配置HTTP KeepAlive特性

都提供了跨平臺級的支持

都對測試結果集的收集和分析做的很好

2) 與LoadRunner對比
不同之處

LoadRunner是一個非常龐大的工具,功能比JMeter要強大,操作也更加復雜,適合于專門長期從事性能測試領域的應用和研究

LoadRunner是商業軟件,有價格不菲的授權許可費用,JMeter是開源軟件

LoadRunner有比JMeter更加詳細和龐大的文檔系統,為完成復雜的測試任務提供了強有力的支持

LoadRunner由三大組件VuGen、Controllor、Analysis組成,JMeter是一個整體,沒有做這樣的拆分

LoadRunner的測試分析功能比JMeter要強大的多

LoadRunner對測試任務機的要求比JMeter要高出很多

LoadRunner不僅支持Java擴展,更支持強大C擴展,對測試腳本的可定制性比JMeter要復雜和強大

相同之處

都支持在Windows和Linux平臺上運行測試任務

都具備設置集合點、檢查點、參數化特性

5. 未來展望(下一個版本)
1)將會提供對MQTT的支持

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)并不是一門新技校,它是由IBM開發的一套面向M2M(Machine-to-Machine)的即時通信協議,基于TCP/IP的連接實現,所以它幾乎支持所有平臺,未來可能會成為物聯網的一部分。

2)修復和改進

高分屏下的顯示優化、文檔改進、圖片壓縮、Label掃描優化。

6. 附加信息
1)JMeter的運行原理分析

JMeter模擬多用戶并發,使用的JDK的線程模式,而且JDK的線程模式都是一堆native方法,它是JDK的C語言實現中根據不同的系統做出的處理,在Windows上最后會轉為調用C標準庫,在Linux上最后轉為pthread庫,所以當JMeter正在運行時,可以查看到它所依存的java進程的線程數量。

JMeter的代碼量十分龐大,經過多年積累,本身的邏輯和體系結構也十分完善,它支持Web、HTTP、HTTPS、SOAP/REST、FTP、JDBC、LDAP、JMS、TCP、SMTP、POP3、IMAP,甚至支持Native模式的Shell腳本,GUI圖表庫使用的不是AWT,也不是SWT,而是Swing,界面顯示優美,控件功能豐富。因此JMeter擁有一整套完整的類管理機制和接口。
JMeter還擁有很強的二次開發和擴展能力,因此甚至有團隊用它來做回歸測試而不是僅僅是性能和壓力測試。

JMeter官方文檔說的很清楚,JMeter不是一個瀏覽器,它不會解析HTML文檔,也不會執行JS腳本。

JMeter還支持BeanShell。

JMeter對HTTP協議的Response,無論是JSON還是XML,都能正確的解析。

JMeter的一堆properties文件中,有數量龐大的定制參數,通過這些功能,可以實現更多可定制化的任務和需求。

JMeter還支持部署為集群服務器任務,執行超大規模的測試任務。

2)Apache ab工具的運行原理分析

ab工具使用C語言寫成,但是它不是一個獨立的項目,而是著名的httpd服務器項目的一個組件。它復用了APR的內存池技術,因此不會有頻繁的內存申請和銷毀動作,所以從基礎設計上就保證了高并發測試任務的高效執行,同時又能有效避免內存泄漏或者溢出。

Apache ab工具使用的是多路模式,依賴于創建非阻塞式的socket,以Poll的方式實現,pollset設計是一種優秀的設計方案,它不光是為了socket還可以是file。關鍵函數的原型是:

static void start_connect(struct connection * c);

關于這個函數,程序會依據并發數和執行次數對I/O實現多路復用,而且是用的多層循環遍歷和遞歸的方式。通常情況下,軟件開發時如果同時在一個函數中使用過多的循環嵌套和遞歸,會導致程序性能下降,甚至棧溢出,如果在這種情況下再大量使用全局變量,整個項目代碼就會變的不可控,而ab卻反其道而行之,在內存池的基礎上,引入這種機制,實現了對非阻塞式socket的快速創建和遍歷操作,然后再使用事件回調機制收集和處理結果,從而十分巧妙的同時實現了低內存、高并發、低CPU的目標,保證了極高的性能和效率。所以,網絡上大量流傳許多貼子說的ab工具是使用多線程模擬并發的結論是錯誤的,它是單進程單線程的工作模式,至于多線程,那已經是系統底層對異步socket的處理了,和ab工具是否是多線程并沒有什么關系。程序運行之初,它調用下面的代碼完成內存池的初始化:

apr_pool_create(&cntxt, NULL);

cntxt的類型是apr_pool_t,這是一個結構體,在所有測試完成之后,再次調用下面的代碼完成內存池的釋放:

apr_pool_destroy(cntxt);

它支持一堆復雜的命令行參數調用,然后根據這些參數配置選項,程序運行之初會在內存中創建幾個十分重要的數據結構:

connection:結構體,HTTP請求實例數據結構,它包含與請求相關的關鍵數據,比如內存池管理實例ctx、Socket對象aprsock、Poll集合的描述對象實例pollfd以及請求本身相關的狀態、時間、緩沖區大小、keep-alive等,具體的詳細介紹請繼續往下看。

apr_pool_t:結構體,這是內存池的管理實例,每一個HTTP請求都會產生這樣一個實例,
apr_socket_t:結構體,包括自己內存池管理實例、socket類型、協議、本地地址、遠程地址、端口號、是否阻塞方式、超時時間等調用選項。

apr_pollfd_t:結構體,pollset的描述,在ab工具中,會定義多個指向這個結構體數據結構的指針,在底層處理中,這些數據會生成一個鏈表。包括類型、請求事件標記、接收事件標記、Poll描述信息、當前調用者的上下文信息等。這個結構體中還有reqevents和rtnevents兩個成員,是內核態和用戶態輪詢I/O狀態和回調時用的事件句柄。

apr_size_t:也就是C語言中的size_t,無符號整型,保存當前HTTP請求在apr_socket_recv上完成的大小信息。

apr_time_t:本質上是一個apr_int64_t,也就是long類型,保存請求時間相關的毫秒級的時間,包括啟動時間、連接時間、請求寫入時間、讀取完成時間、請求完成時間,引用的是timestamp機制。

data:結構體,保存的是連接時間相關的所有數據,主要是啟動時間、請求發出和讀取響應之間的間隔時長(請求連接成功的時間)、整個連續所花費的時間、各連接之間的間隔時間。與這個結構體緊密綁定的還有幾個compare函數,是用來處理測試結果的時候做數據比較用的。

apr_int64_t:對C語言中long類型的包裝。

request:這是一個全局變量,指向大小為8192個char的數組的指針,里面保存的是HTTP請求的響應頭信息,比如HTTP/1.0、Keep-Alive、Content-type等。

apr_pollset_t:pollset對象,pollset是一組socket的集合。

apr_sockaddr_t:HTTP請求的socket相關的數據結構。

簡單的講,ab工具中大量使用了APR中的數據結構,這些數據結構,是Apache根據需要對C語言的數據類型、網絡、I/O、以及一些系統調用的再封裝,完整的數據結構文檔及其應用方法可以在這里看到,更加細致的網絡相關的接口使用方法,還需要參考《Unix網絡編程第1卷》,這本書的Chapter 6中作者詳細介紹了五種I/O模型及其使用方法。

3)nmon工具的運行原理分析

nmon的原理比較簡單,全部依賴于C語言標準庫和Linux系統的內核文件系統/proc,沒有第三方庫的支持。程序運行之初,針對CPU、內存、硬盤、網絡這些設備,分別定義了不同的函數,解析它們的內核參數和系統信息,然后創建一個主循環去輪詢這些系統信息,并將結果輸出到指定的設備中去,使用最多的庫函數就是curses函數mvwprintw,獲取到數據之后,以特定的方式組織起來保存到一個文本文件中去,對于這個保存的文件,使用nmonchart可以很輕松的將它轉換成一個漂亮的HTML文檔。

curses函數庫是Linux下基于文本模式使用的圖形函數庫,它的出現,使得即使是文本模式下的Linux界面,也可以有非常漂亮的輸出和顯示,它可以很自由的定義輸出的目標設備、顏色、形狀等眾多的特性。不同的Linux版本對curses的支持有所不同,所以當你下載下來nmon之后會發現它針對不同發行版的Linux有不同的運行程序,沒關系,我們只需要保留我們想要使用的(比如CentOS),其他的一律刪除即可,它們之間沒有依賴關系,只需要一個主程序就可以運行了。執行服務器性能測試時nmon工具幾乎是必不可少的,而nmon又有一堆參數需要配置,這種情況下我們可以把整個命令行和參數寫到一個Shell腳本中,需要執行測試時只需要修改少量的幾個關鍵參數,然后運行這個腳本即可,如果再自動調用nmonchart,然后將結果輸出到HTTP服務器上,我們就可隨時隨地的動態的查看服務器的性能表現了。

4)結束語

這篇文檔是我這兩個星期執行性能測試以來的一些分析研究和總結,歸納整理出來,供以后需要的同學研究使用,這樣可以免去大家百度和谷歌的時間,提升工作效率,同時也是我們本身工作的一種積累和歸檔,希望能為后來人提供一些參考和借鑒,鑒于本人學識有限,文中如有錯誤,敬請諒解。

總結:

感謝每一個認真閱讀我文章的人!!!

作為一位過來人也是希望大家少走一些彎路,如果你不想再體驗一次學習時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,在這里我給大家分享一些自動化測試的學習資源,希望能給你前進的路上帶來幫助。

軟件測試面試文檔

我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有字節大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

?

? ? ? ? ? 視頻文檔獲取方式:
這份文檔和視頻資料,對于想從事【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!以上均可以分享,點下方小卡片即可自行領取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/21895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21895.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cocos Creator開發學習路線

1.JavaScript與TypeScript程序設計 由于可以跨平臺發布,同時要能支持h5的游戲,cocos creator選擇了JavaScript與TypeScript來做為它的開發語言,所以我們要先學習JavaScript與TypeScript。TypeScript是基于JavaScript的一個語法糖,運行的時候被編譯為JavaScript,所以我們要…

JVM學習-監控工具(二)

jmap:導出內存映像文件&內存使用情況 基本情況 jmap(JVM Memory Map):一方法獲取dump文件(堆轉儲快照文件,二進制文件),還可以獲取目標Java進程的內存相關信息,包括Java堆各區域的使用情況、堆中對象的統計信息、…

MyBatis學習(二)--MyBatis獲取參數值的兩種方式

1、搭建新的module:mybatis_parameter MyBatis獲取參數值的兩種方式:${}和#{} ${}的本質就是字符串拼接,采用sql拼接,無法防止sql注入 #{}的本質就是占位符賦值 ,采用預編譯 防止sql注入 不同參數使用案例 2、單個字面量類型…

OpenHarmony嵌套類對象屬性變化:@Observed裝飾器和@ObjectLink裝飾器

上文所述的裝飾器僅能觀察到第一層的變化,但是在實際應用開發中,應用會根據開發需要,封裝自己的數據模型。對于多層嵌套的情況,比如二維數組,或者數組項class,或者class的屬性是class,他們的第二…

實時瞳孔分割算法-RITnet論文復現

源代碼在這里RITnet-Github 這個模型比較小眾,我們實驗室使用了官方提供的模型進行瞳孔中心位置提取,以實現視線追蹤,效果很好 一、數據集準備 RITnet也是那一屆openEDS數據集挑戰賽的冠軍模型,openEDS數據集可以從Kaggle上下載&a…

數據結構--關鍵路徑

事件v1-表示整個工程開始(源點:入度為0的頂點) 事件v9-表示整個工程結束(匯點:出度為0的頂點) 關鍵路徑:路徑長度最長的路徑 求解關鍵路徑問題(AOE網) 定義四個描述量 …

網絡網絡層之(6)ICMPv4協議

網絡網絡層之(6)ICMPv4協議 Author: Once Day Date: 2024年6月2日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 全系列文章可參考專欄: 通信網絡技術_Once-Day的博客-CS…

華為OD刷題C卷 - 每日刷題 7(字符串分隔(二)、歡樂的周末)

兩段代碼分別解決了兩個不同的問題,下面是對它們的概述: 1、(字符串分隔(二)): 這段代碼是解決“字符串分隔(二)”的問題。它提供了一個Java類Main,其中包含…

Java面試題-Tomcat高級面試題

Tomcat 9相較于之前的版本有哪些主要的新特性? Tomcat 9相較于之前的版本,主要有以下幾個新特性: HTTP/2支持:Tomcat 9引入了對HTTP/2協議的支持,這可以顯著提高網站的性能和安全性。HTTP/2協議允許單個連接上進行多…

多語言for循環遍歷總結

多語言for循環遍歷總結 工作中經常需要遍歷對象,但不同編程語言之間存在一些細微差別。為了便于比較和參考,這里對一些常用的遍歷方法進行了總結。 JAVA 數組遍歷 Test void ArrayForTest() {String[] array {"劉備","關羽", &…

大模型備案項目補貼政策一覽【保持更新】

大模型項目、AI類項目、大模型備案通過后等一籃子財政補貼政策 上海市 加快創新體系構建 1. 提升自主創新水平:對引領大模型發展或取得顛覆性突破的項目,最高給予1000萬元補貼支持。 2. 加強算力資源保障:實施算力伙伴計劃,對…

力扣174題動態規劃:地下城游戲(含模擬面試)

?????? 歡迎來到我的博客。希望您能在這里找到既有價值又有趣的內容,和我一起探索、學習和成長。歡迎評論區暢所欲言、享受知識的樂趣! 推薦:數據分析螺絲釘的首頁 關注微信公眾號 數據分析螺絲釘 免費領取價值萬元的python/java/商業…

Java進階學習筆記36——算法

什么是算法? 解決某個實際問題的過程和方法。 1)導航; 2)滴滴打車; 3)抖音; 不同的算法,效率高、性能好! 在Java中,代碼已經幫我們寫好了,但為…

雪花算法詳解及源碼分析

雪花算法的簡介: 雪花算法用來實現全局唯一ID的業務主鍵,解決分庫分表之后主鍵的唯一性問題,所以就單從全局唯一性來說,其實有很多的解決方法,比如說UUID、數據庫的全局表的自增ID 但是在實際的開發過程中&#xff0…

離散點云擬合三維平面參數推導(基于最小二乘)

1、背景介紹 實際中,很多人工構造物是由平面結構構造而成,如下圖所示,為一典型的由多個平面組成的人工構筑物。因此,根據離散點擬合成平面,獲取擬合平面方程,是點云數據處理中非常常見的數據處理操作。 2、…

鴻蒙Ability Kit(程序框架服務)【ExtensionAbility組件】

ExtensionAbility組件 ExtensionAbility組件是基于特定場景(例如服務卡片、輸入法等)提供的應用組件,以便滿足更多的使用場景。 每一個具體場景對應一個[ExtensionAbilityType],開發者只能使用(包括實現和訪問&#…

WPS的excel表格設置了編輯權限,要怎么取消?

在日常生活和工作中,我們經常會使用WPS Office辦公軟件來處理各種文檔,其中WPS Excel表格是我們進行數據處理和分析的重要工具。為了保護表格中的數據不被隨意修改,我們有時會設置編輯權限。然而,隨著時間的推移或需求的變更&…

基于FPGA的SystemVerilog練習

文章目錄 一、認識SystemVerilogSystemVerilog的語言特性SystemVerilog的應用領域SystemVerilog的優勢SystemVerilog的未來發展方向 二、流水燈代碼流水燈部分testbench仿真文件 三、用systemVerilog實現超聲波測距計時器測距部分led部分數碼管部分采樣部分頂層文件引腳綁定效果…

魯教版七年級數學下冊-筆記

文章目錄 第七章 二元一次方程組1 二元一次方程組2 解二元一次方程組3 二元一次方程組的應用4 二元一次方程與一次函數5 三元一次方程組 第八章 平行線的有關證明1 定義與命題2 證明的必要性3 基本事實與定理4 平行線的判定定理5 平行限的性質定理6 三角形內角和定理 第九章 概…

dpdk uio整體分析及網卡加載

參考:https://zhuanlan.zhihu.com/p/477600165 一、Linux內核知識點 1. __attribute__ constructor/destructor (1)若函數被設定為constructor屬性,則該函數會在 main()函數執行之前被自動的執行。 (2)若函數被設定為destructor屬性,則該函數會在main()函數執…