1. 程式人生 > >golang 效能測試 (1) 基準效能測試

golang 效能測試 (1) 基準效能測試

本文介紹golang 如何做基準效能測試。

編寫完程式碼除了跑必要的單元測試外,還需要考慮程式碼跑起來的效能如何。效能的衡量其實就是程式執行時候程序的記憶體分配,CPU消耗情況。

golang 語言在提供了功能測試的基礎上,提供了豐富的效能測試功能。

SHOW CODE

首先,從一個例子來講起。 隨便寫一個簡單的快速排序,然後和系統自帶的排序做一個性能比較。

如下為簡版快排的程式碼:

package benchmark

import "sort"

func QSort(data []int) {
	myqsort(data, 0, len(data)-1)
}

func myqsort(data []int, s, e int) {
	if s >= e {
		return
	}

	t := data[s]
	i, j := s, e

	for i < j {
		for ; i < j && data[j] >= t; j-- { }
		for ; i < j && data[i] < t; i++ { }
		if i < j { break }

		data[i], data[j] = data[j], data[i]
		i++
		j--
	}

	data[i] = t
	myqsort(data, s, i-1)
	myqsort(data, i+1, e)
}

然後編寫一個測試的test。

package benchmark

import "testing"
import "math/rand"
import "time"
import "sort"

var ints []int

// 長度為 1w 的資料使用系統自帶排序
func BenchmarkSort10k(t *testing.B) {
	slice := ints[0:10000]
	t.ResetTimer()   // 只考慮下面程式碼的執行事件,所以重置計時器
	for i := 0; i < t.N; i++ {
		sort.Ints(slice)
	}
}

// 長度為 100 的資料使用系統自帶排序
func BenchmarkSort100(t *testing.B) {
	slice := ints[0:100]
	t.ResetTimer()
	for i := 0; i < t.N; i++ {
		sort.Ints(slice)
	}
}

// 長度為 1w 的資料使用上述程式碼排序
func BenchmarkQsort10k(t *testing.B) {
	slice := ints[0:10000]
	t.ResetTimer()
	for i := 0; i < t.N; i++ {
		QSort(slice)
	}
}

// 長度為 100 的資料使用上述程式碼排序
func BenchmarkQsort100(t *testing.B) {
	slice := ints[0:100]
	t.ResetTimer()
	for i := 0; i < t.N; i++ {
		QSort(slice)
	}
}

// 資料初始化,為了保證每次資料都是一致的。
func TestMain(m *testing.M) {
	rand.Seed(time.Now().Unix())
	ints = make([]int, 10000)

	for i := 0; i < 10000; i++ {
		ints[i] = rand.Int()
	}

	m.Run()
}

執行命令 :

# go test -cover -count 3  -benchmem  -bench=.

執行結果如下圖:

基準測試,預設將每個方法執行1s中,然後展示執行的次數,每一次執行的耗時, 上述還展示了記憶體每次分配的大小,以及每次benchmark分配的次數。上述的命令列指定了執行次數為3次,顯示程式碼覆蓋率和記憶體分配情況。

從基準測試的結果可以分析出:對於1w資料量的排序,自帶的排序比我的排序演算法要快20倍左右;100資料量的排序,手擼的排序略勝一籌。
從記憶體分析來講,系統自帶的會使用4B的資料,而我的演算法無記憶體分配。

INTRODUCE BENCHMARK

引入golang 提供的 testing

包,寫需要的基準測試的方法(方法名必須以Benchmark開頭, 引數必須為 *testing.B)。

若需要做一些資料初始化的工作,可以如上寫一個TestMain 方法,將資料初始化的工作在這裡完成。

除了這些,可以看*testing.B, *testing.M 的相關方法即可。

最後,只要執行官方提供的 go test -bench=. 命令,即可開始跑基準測試。 當然,還有其他選項可以滿足我們多樣的需求。
例如:

  • -cpu 1,2,4 指定執行的cpu 格式
  • -count n 指定執行的次數
  • -benchtime 每一條測試執行的時間 (預設是1s)
  • -bench 指定執行bench的方法, . 是全部
  • -benchmem 顯示記憶體分配情況

其他引數可以通過 go help testflag 檢視

WHY SO SLOW

  1. 我這裡選取的是第一個數作為中位數,資料越大越可能出現傾斜,排序慢的概率也大。
  2. 正常的排序包中,都會在對小於等於12 個數的陣列做排序時使用希爾排序,速度也有很大提升。

除了簡單的做效能測試外,golang 還自帶了效能分析的工具,我們可以快速找出程式碼中的記憶體分配、cpu消耗的核心區,幫助我們解決服務的效能問題。下篇文章將做詳細瞭解。

相關推薦

golang 效能測試 (1) 基準效能測試

本文介紹golang 如何做基準效能測試。 編寫完程式碼除了跑必要的單元測試外,還需要考慮程式碼跑起來的效能如何。效能的衡量其實就是程式執行時候程序的記憶體分配,CPU消耗情況。 golang 語言在提供了功能測試的基礎上,提供了豐富的效能測試功能。 SHOW CODE 首先,從一個例子來講起。 隨便寫一個簡

專項測試(一)相容測試1-app相容性測試

        這個主要是android系統的碎片化引起的問題。不同的android手機廠商都對android系統進行了或深或淺的定製。實際上我們也確定曾遇到一些不同廠家ROM導致的問題,比如呼叫相機和一些底層服務出現的不相容。現實中我們會採購一些主流廠家的手機型號,並在上面驗證功能。

非功能性約束之效能1)-效能銀彈:快取

在《什麼是架構屬性》一文中提到提高「效能」的主要方式是優化,而優化的其中一個主要手段就是新增快取! 在軟體工程裡有這麼一句話:「沒有銀彈」!就是說由於軟體工程的複雜性,沒有任何一種技術或方法能解決所有問題!軟體工程是複雜的,沒有銀彈!但是,軟體工程中的某一個問題,是有銀彈的! 在《架構風格:萬金油CS與分層》

golang 效能測試 (1)

本文介紹golang 如何做基準效能測試。 編寫完程式碼除了跑必要的單元測試外,還需要考慮程式碼跑起來的效能如何。效能的衡量其實就是程式執行時候程序的記憶體分配,CPU消耗情況。 golang 語言在提供了功能測試的基礎上,提供了豐富的效能測試功能。 SHOW CODE 首先,從一個例子來講起。 隨便寫一個簡

測試報告】效能測試報告模版1

  目錄 一、文件目錄 二、模版下載 三、文件內容 四、測試環境軟硬體配置資料獲取 一、文件目錄 二、模版下載 我的資源下載地址:【測試報告】效能測試報告模版1 三、文件內容 四

HBase基準效能測試報告

作者:範欣欣 本次測試主要評估線上HBase的整體效能,量化當前HBase的效能指標,對各種場景下HBase效能表現進行評估,為業務應用提供參考。本篇文章主要介紹此次測試的基本條件,HBase在各種測試場景下的效能指標(主要包括單次請求平均延遲和系統吞吐量)以及對應的資源利用情況,並對各種測試結果進行分析。

RabbitMQ客戶端引數效能測試(1)

最近我在公司上線了rabbitmq,替換了原來阿里出的rocketmq(別說我黑阿里的東西,這玩意真的都是坑),我並不想告訴你rabbitmq安裝過程是怎麼樣的,去看官網就知道,戳這裡 看看網上說rabbitmq效率多高多高,但是怎麼測試也只有15000Qps,還是用golang的客戶端來測試訪問的中間沒有

乾貨分享:SparkBench--Spark平臺的基準效能測試

SparkBench簡介 SparkBench是Spark的基準效能測試專案,由來自IBM Watson研究中心的五位研究者(Min Li, Jian Tan, Yandong Wang, Li Zhang, Valentina Salapura)發起,並貢獻至開源社群。

效能測試-1-原理

話說: 難度係數:★★★☆☆ 建議用時:2周 目標 初步搭建一個自動化測試框架,技術選型:Jenkins+Ant+Jmeter。 1、按照場景組織各個介面,整體按照指定場景順序執行; 2、引數可注入(併發量threadsNumber、迴圈次數lo

關於golang測試覆蓋率及效能測試

命令行同樣可以使用 在powershell 需要除錯的資料夾下go test -coverprofile=c.out 繼續輸入go tool cover -html=c.out 瀏覽器列印具體程式碼覆蓋率 繼續探討效能測試語句如下 命令行同樣可以執行效能測試

效能測試1-分類和定義

    效能測試按被測物件來分類會有(服務端、中介軟體、客戶端等) 本文章重點對服務端、系統的效能測試進行討論。   常會別人說到效能測試、負載測試、壓力測試、併發測試,很多人都是混合使用,或者一會叫壓力測試,一會叫併發測試。這些概念除了非測試人員分不清楚,甚至許多專業測試人員也對這些名詞也很模糊。關於

大話效能測試系列(1)- 效能測試概念與主要指標

如果你對效能測試感興趣,但是又不熟悉理論知識,可以看下面的系列文章 https://www.cnblogs.com/poloyy/category/1620792.html   學習前的認知 我們在學習效能測試之前,需要有個新的認識:效能測試,不再是像功能測試一樣單純的找 Bug,而是去找效能指標

效能分析與程式碼覆蓋率測試

效能分析 對程式碼優化的前提是需要了解效能瓶頸在什麼地方,程式執行的主要時間是消耗在哪裡,對於比較複雜的程式碼可以藉助一些工具來定位,python 內建了豐富的效能分析工具,如 profile,cProfile 與 hotshot 等。其中 Profiler 是 python 自帶的一組程式,能

效能、負載、壓力測試——從效能測試角度理解系統開發

引言 最近,由於舊機器下線,我對過去部署的一些服務做了遷移,順帶對新部署的服務做了一個簡單的效能測試。在實施過程中,我發現自己對很多效能指標的理解很不清晰,對於併發數、壓力、吞吐量、延遲等概念,通常是以望文生義的方式使用。對於系統應該關注什麼樣的效能指標,認識也不完整。為此,我閱讀了wiki百科以及一些部落

golang 測試,單元測試基準測試

go test xxx.go 帶 -v 表示冗餘輸出,成功pass的也會輸出資訊。 檔案命名使用 xx_test.go 儲存在專案目錄裡即可,也可以新建個test目錄,TestAll 測試分為單元測試(功能)和基準測試(效能)。 單元測試函式名Test開頭,接收一個指標型引數(*te

【Web效能測試】記憶體洩漏測試方法之chrome記憶體快照

首先明確一下我們測試的目的:客戶端瀏覽器的js記憶體是否存在洩漏,伺服器端的話可不是這麼測,防止使用者使用時瀏覽器卡頓或崩潰。 F12開啟開發者工具,選中Memory頁簽下的Heap snapshot。 每次我們記錄快照前都要點選那個小垃圾桶,清一下快取,因為我們測記憶體洩漏是看

提交訂單效能優化系列之003-測試阿里巴巴的druid資料來源

概括總結 使用druid資料來源之後,相對於第002版自己隨手寫的資料庫,效能反而下降了8.49%。原因在於,002版是“隨手”寫的,因此功能非常簡陋,要什麼沒什麼,只能從記憶體中獲取連線,因此很快。

提交訂單效能優化系列之004-測試hikari資料來源

概括總結 使用hikari資料來源之後,相對於第003版的druid資料來源,從提交訂單這個複雜的操作上來說,效能提升了17.79%。而從獲取資料庫連線這一簡單的操作上來說,hikari比druid優秀幾百倍。 004版本更新說明 pom.xml檔案中

提交訂單效能優化系列之013-測試SQL語句中少查詢幾個欄位(包括大欄位)

概括總結 這一版本寫了兩個測試類,一個測試類中查詢全部欄位,另一個測試類中只查詢必要的欄位,然後對比效能。結論是:根據是減少的欄位的長度不同,效能會不同。具體請檢視下面的測試結果。 013版本更新說