對于性能測試工具,它的性能腳本執行效率,決定了在一個加壓的機器上,能夠運行多少個虛擬用戶(virtual user)。比如,執行一個測試腳本的時間是100ms,相對于執行相同的測試腳本時間為20ms,就相差了5倍。
在早期的performanceRunner(簡稱PR)版本,單臺壓力機的較大虛擬用戶大概在300-500左右。當使用更高的虛擬用戶,會導致性能數據不準確,無法達到較大壓力。
PR的較新版本,改進了測試腳本的核心算法,使得單個腳本的執行時間大幅度縮減,這樣就可以執行更多的VU。
我們知道,PR和JMeter都采用了beanshell作為腳本。根據各個腳本語言的性能對比測試(與python、js、java等),我們可以發現,beanshell是性能較糟糕的腳本語言。因此,其實不是非常適合用來做高性能處理。具體的內容,如果讀者有興趣可以去搜索網站上關于beanshell的相關文章。
那么,如果提升beanshell腳本的執行效率,就是PR執行器提升VU的核心問題。
通過研究我們發現,beanshell的腳本執行,具有2個步驟:第一,把腳本編譯成語法樹;第二,執行語法樹上的語法元素。從編譯原理的角度來看,編譯的復雜度比執行高很多,也就是說,beanshell的測試腳本執行,大多數的時間用在編譯上。
對于性能測試而言,單個腳本基本是不改變的,但是它需要倍執行上萬次,甚至百萬次。
如果我們能夠讓系統只執行一次編譯,之后都只執行語法樹,而不再編譯,是不是可以大幅度提升系統的性能?
按照以上的原來,我們在PR中,對測試腳本執行進行了優化,果然,性能得到大幅度提升,比原來快了5倍以上!!!也就是執行測試腳本的所消耗時間,縮短到不足原來的20%。
這樣,我們就使得加壓機上的較大VU格式,提升到能夠支持2000 VU(在十代i7上)。
帶來的好處是顯而易見的。比如,我們要執行4萬VU的一次性能測試,原來較多只能執行較大VU格式為200的設備的前提下,我們需要200臺設備,才能夠達到需要。現在,在十代i7的設備下,我們可以只使用20臺設備,即可實現4萬VU的性能測試!
節省了大量的設備,同時也減少了軟件安裝部署、執行監控的時間。對于需要進行海量壓力加壓的客戶而言,價值非常高。
推薦閱讀: