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 首先,從一個例子來講起。 隨便寫一個簡

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

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

Golang效能測試與思考

本文測試Go、Python、PyPy、C的效率,作為學習Go的參考標準。測試用例:進行(2<<25)次簡單加法 測試環境: 系統:Windows7 專業版 CPU:Intel® Core™ i5-4590 CPU @ 3.30GHZ 3.30GHZ

golang--效能測試和分析

前言 測試分為:壓力測試、負載測試、效能測試,功能測試等等,其中在開發過程中開發人員經常要寫一些test case unit 自己的模組進行功能測試測和效能。在分析出模組的效能瓶頸後開發人員就需要針對性的調優,但需要提醒的是調優工程一般要放在最後在進行,過早地優化會浪費開發時間,而且有時在需求或者功能變動後

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

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

效能測試-1-原理

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

效能測試1-分類和定義

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

[go]golang snmp測試(1)

golang發展挺快的,現在都已經1.9了。現在也有了相對完備和可用的snmp庫。目前支援snmpv3的主要有2個庫,star都很少,看起來用snmp的人不多啊。github.com/soniah/gosnmp   293stargithub.com/k-sone/snmpg

Golang 效能測試 (3) 跟蹤刨析 golang trace

簡介 對於絕大部分服務,跟蹤刨析是用不到的。但是如果遇到了下面問題,可以不妨一試: 懷疑哪個協程慢了 系統呼叫有問題 協程排程問題 (chan 互動、互斥鎖、訊號量等) 懷疑是 gc (Garbage-Collect) 影響了服務效能 網路阻塞 等等 坦白的講,通過跟蹤刨析可以看到每個協程在某一時刻在幹什

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

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

效能測試通用原則【3-1;2-5-10;80/20】

如果設計說明書中沒有給出明確的標準,那麼可以參考國外的業內公認的一些標準:    3+1原則(指量、全、深+快) 主要對效能測試設計、測試執行以及資料分析。 量:包括業務量(業務型別),負荷量(系統處理的流量),配置量(軟體配置和硬體配置),使用者量(靜態使用者和動態使用者)

jmeter介面效能測試1)----簡單的介面測試入門

首先來看一下介面的資訊:host:http://api.jhled888.comuri: /cgi-bin/get.json 介面請求方式: GET 入參:appid: jhyjlhxa03q4f2qlmfappsecret:eb28066907b14310a9401c0586c840

效能測試初級篇1(理論知識)

第一章 效能測試基礎 1、為什麼做效能測試     找出效能的瓶頸,達到軟體的質量目標,給使用者帶來良好的體驗 2、效能測試流程     效能測試需求分析---效能測試計劃---效能測試用例---效能測試平臺搭建---效能測試指令碼開發---效能測試場景設定---效能測試執行---效能測試結果分析(找

Golang的簡單反射效能測試

測試用例 我們對Golang的結構體變數賦值, 以及單引數函式呼叫進行反射和native操作的測試package mainimport ( "reflect" "testing")type data struct { Hp int}const AssignTimes = 100000

raid0+1和raid5的效能測試結果

網上關於效能比較和原理的文章很多,這裡不再過多解釋,只寫測試結果。測試目的:4塊物理硬碟,使用IBMraid卡做raid。4塊做raid 5和兩塊盤分別raid 1的讀效能比較。由於寫會往本地盤寫入資料,暫時沒有測試工具:oracle orign 4塊物理盤做 raid 5

Golang單元測試效能測試

Test 單元測試 testing包提供了對Go包的自動測試支援。 這是和go test 命令相呼應的功能, go test 命令會自動執行所以符合格式 func TestXXX(t *testing.T) 的函式。 Benchmark 效能測試 Functions of the f

LoadRunner:Controller及結果分析 一、效能測試概述 1、關於效能測試目標: ①TPS ②一定併發使用者數下功能點的響應時間 ③一定響應時間內功能點的併發使用者數 效能測試不是

一、效能測試概述 1、關於效能測試目標: ①TPS ②一定併發使用者數下功能點的響應時間 ③一定響應時間內功能點的併發使用者數 效能測試不是達到既定目標即可,還要測試軟體功能能夠達到的極限值。 2、關於效能測試的場景: 在指令碼錄製除錯完成後,需要進行場景的設定,進而對指令碼進行壓測,分析壓測的結果。 效能

通過python呼叫adb命令對app進行效能測試(6 -1

上篇文章中講述了adb是什麼,以及常用的命令,下面我們來看下通過adb來檢視手機裝置中的效能引數,首先要檢視apk的包名和預設Activity的名字有好幾種方式,下面介紹2種 第一種 1 開啟cmd 切換目錄D:\tool\android-sdk_r24.

效能測試瓶頸分析(1

所謂效能瓶頸是限制系統性能的關鍵因素 1、硬體上的效能瓶頸  包括:CPU、記憶體(RAM)、磁碟I/O 例如:在需求分析和概要設計師。確定資料庫伺服器需要6個CPU、12G記憶體,但是測試時,發現CPU的持續利用率在95%以上,這時可認為在硬體上出現效能瓶頸