記錄一次golang代碼優化實戰
之前從來沒搞過golang的代碼優化,機緣巧合,有個golang的開源專案有性能優化的需要,于是就拿來試試看golang代碼的優化了,
步驟一
使用benchmark與pprof, 進行性能測驗
go test -cpuprofile cpu.prof -memprofile mem.prof -bench . --count=5
pprof -http=":8091" ./cpu.prof


步驟二
觀察代碼,很多地方可以明確使用uint32卻為定義變數型別,還有一些重復代碼如
tmp = x+y
b += a
a = ...
b+=a
tmp = x+y
c +=a
這里tmp=a+b重復計算兩次,
步驟三
觀察了源代碼中的一些內容,發現代碼內部大量使用了指標,而不是資料,這里不是說指標不好,而是專案中大量的
func sum(a,b){
return a+b
}
卻實作為:
func sum(*c,*a,*b){
c=a+b
}
這樣可以節約記憶體和資料從記憶體到堆疊的呼叫,
結果
before:
BenchmarkSM2Sign-16 3390 313408 ns/op 5426 B/op 117 allocs/op
BenchmarkSM2Sign-16 3765 353670 ns/op 5428 B/op 117 allocs/op
BenchmarkSM2Sign-16 3213 314760 ns/op 5448 B/op 117 allocs/op
BenchmarkSM2Sign-16 4060 300734 ns/op 5402 B/op 117 allocs/op
BenchmarkSM2Sign-16 3696 299816 ns/op 5431 B/op 117 allocs/op
BenchmarkSM2Verify-16 709 1637072 ns/op 78255 B/op 1602 allocs/op
BenchmarkSM2Verify-16 715 1646294 ns/op 81814 B/op 1675 allocs/op
BenchmarkSM2Verify-16 757 1653271 ns/op 78261 B/op 1617 allocs/op
BenchmarkSM2Verify-16 735 1693393 ns/op 76773 B/op 1588 allocs/op
BenchmarkSM2Verify-16 724 1634362 ns/op 79409 B/op 1643 allocs/op
after:
BenchmarkSM2Sign-16 4339 285344 ns/op 5404 B/op 117 allocs/op
BenchmarkSM2Sign-16 3986 276869 ns/op 5429 B/op 117 allocs/op
BenchmarkSM2Sign-16 4404 276076 ns/op 5431 B/op 117 allocs/op
BenchmarkSM2Sign-16 3960 274832 ns/op 5422 B/op 117 allocs/op
BenchmarkSM2Sign-16 3876 277349 ns/op 5413 B/op 117 allocs/op
BenchmarkSM2Verify-16 808 1461962 ns/op 78744 B/op 1628 allocs/op
BenchmarkSM2Verify-16 829 1450970 ns/op 77440 B/op 1594 allocs/op
BenchmarkSM2Verify-16 811 1447418 ns/op 77846 B/op 1601 allocs/op
BenchmarkSM2Verify-16 812 1420193 ns/op 74632 B/op 1538 allocs/op
BenchmarkSM2Verify-16 832 1436850 ns/op 76475 B/op 1572 allocs/op
產出
https://github.com/Hyperledger-TWGC/tjfoc-gm/pull/32
https://github.com/Hyperledger-TWGC/tjfoc-gm/pull/33
參考
https://my.oschina.net/wdyoschina/blog/710251
https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/246212.html
標籤:區塊鏈
上一篇:怎么防止ETH挖礦軟體抽水 怎么攔截ETH挖礦抽水 如何提高ETH挖礦礦池算力?
下一篇:成功解決0 sub-policies were satisfied, but this policy requires 1 of the ‘Writers‘ sub-policies to be sa
