本文目錄一覽:
- 1、golang什麼場景設置runtime.GOMAXPROCS=cpu數量會提高性能
- 2、Golang 遊戲leaf系列(六) Go模塊
- 3、請Golang深度用戶說說,現在Golang的性能可以和C比嗎
- 4、嵌入式golang佔用內存高
- 5、golang4核cpu協程數量
- 6、Golang 怎麼得到 CPU 的使用率和可用內存
golang什麼場景設置runtime.GOMAXPROCS=cpu數量會提高性能
這是測試的代碼
// parallel package main
import ( “fmt” “math/rand” “runtime” “sort” “time” )
func testData() [][]int { now := time.Now() src := rand.NewSource(now.UnixNano()) seed := rand.New(src) data := make([][]int, 10000) for i := 0; i len(data); i++ { data[i] = make([]int, 10000) for j := 0; j 10000; j++ { data[i][j] = seed.Intn(100000) } } return data }
func test() { data := testData() ch := make(chan int) for i := 0; i len(data); i++ { go func(ch chan int, data []int) { sort.Ints(data[:]) ch – 1 }(ch, data[i][:]) } for i := 0; i len(data); i++ { -ch } }
func main() { st := time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(2) st = time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(3) st = time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(4) st = time.Now() test() fmt.Println(time.Since(st)) fmt.Println(“Hello World!”) }
該代碼的作用是生成10000個數組,每個數組有10000個int元素,分別調用不同CPU核數進行排序計算。用的是Go內置的排序函數。
中的時間如下
25.6269405s
14.1753705s
10.3508423s
8.5466479s
分別是單核,2核,3核,4核的計算時間。的確用多核後計算速度提升很大。
Golang 遊戲leaf系列(六) Go模塊
在 Golang 遊戲leaf系列(一) 概述與示例 (下文簡稱系列一)中,提到過Go模塊用於創建能夠被 Leaf 管理的 goroutine。Go模塊是對golang中go提供一些額外功能。Go提供回調功能,LinearContext提供順序調用功能。善用 goroutine 能夠充分利用多核資源,Leaf 提供的 Go 機制解決了原生 goroutine 存在的一些問題:
我們來看一個例子(可以在 LeafServer 的模塊的 OnInit 方法中測試):
這裡的 Go 方法接收 2 個函數作為參數,第一個函數會被放置在一個新創建的 goroutine 中執行,在其執行完成之後,第二個函數會在當前 goroutine 中被執行。由此,我們可以看到變數 res 同一時刻總是只被一個 goroutine 訪問,這就避免了同步機制的使用。Go 的設計使得 CPU 得到充分利用,避免操作阻塞當前 goroutine,同時又無需為共享資源同步而憂心。
這裡主動調用了 d.Cb(-d.ChanCb) ,把這個回調取出來了。實際上,在skeleton.Run里會自己取這個通道
看一下源碼:
New方法,會生成指定緩衝長度的ChanCb。然後調用Go方法就是先執行第一個func,然後把第二個放到Cb里。現在手動造一個例子:
這裡解釋一下,d.Go根據源碼來看,實際也是調用了一個協程。然後上面兩次d.Go並不能保證先後順序。目前的輸出結果是1+2那個先執行了,把3寫入d.ChanCb,然後把3讀出來,繼續讀時,d.ChanCb里沒有東西,阻塞了。然後1+1那個協程啟動了,最後又讀到了2。
現在把time.Sleep(time.Second)的注釋解開,會是啥結果呢
這裡執行到time.Sleep睡著了,上面兩個d.Go仍然是不確定順序的,但是會各自的function先執行掉,然後陸續把cb寫入d.ChanCb。看這次輸出,1+2先寫進去的。所以最後執行d.Cb時,就把3先讀出來了。然後d.ChanCb的長度為1,說明還有一個,就是輸出2了。
另外,就是close時會判斷g.pendingGo
這個例子的意思很明顯,NewLinearContext這種方式,即使先調用的慢了半秒,它還是會先執行完。
這裡先是用了一個list,加入的時候用mutexLinearGo鎖了,都加到最後。然後新開協程去處理,讀的時候從最前面開始讀,也要用mutexLinearGo鎖。執行的時候,也要上鎖mutexExecution,確保f()執行完並且寫入g.ChanCb回調,這個mutexExecution鎖才會解除。現在可以改造一個帶回調的例子:
結果說明,確實是2先被寫入了d.ChanCb。
請Golang深度用戶說說,現在Golang的性能可以和C比嗎
不可以,完全沒有可比性。
Golang的優勢是開發速度,C可以自由、精準的操控內存。
拿string類型舉個栗子:
1、修改字元串:
golang:需要分配新內存,然後進行內存copy。
c:可直接修改,可realloc。
2、存一段data:
golang:使用[]byte類型,[]byte轉成string需要進行內存拷貝(排除掉利用指針進行類型轉換的情況)。
c:直接用char[],可讀可寫。
golang中為了語言的安全性,類似的這種限制有很多,犧牲了一部分性能。但golang的優勢也是顯而易見的,goroutine、chan都很好用,而c則需要自己進行進程、線程的管控。
嵌入式golang佔用內存高
嵌入式golang佔用內存高可能問題在於緩存。
清空日誌後比較驚喜地發現,內存瞬間暴降至20M。
嵌入式系統由硬體和軟體組成.是能夠獨立進行運作的器件。其軟體內容只包括軟體運行環境及其操作系統。硬體內容包括信號處理器、存儲器、通信模塊等在內的多方面的內容。相比於一般的計算機處理系統而言,嵌入式系統存在較大的差異性,它不能實現大容量的存儲功能,因為沒有與之相匹配的大容量介質,大部分採用的存儲介質有E-PROM、EEPROM等,軟體部分以API編程介面作為開發平台的核心。嵌入式系統最核心的層次是中央處理單元部分,它包含運算器和控制器模塊,在cpu的基礎上進一步配上存儲器模塊、電源模塊、複位模塊等就構成了通常所說的最小系統。由於技術的進步,集成電路生產商通常會把許多外設做進同一個集成電路中,這樣在使用上更加方便,這樣一個晶元通常稱之為微控制器。在微控制器的基礎上進一步擴展電源感測與檢測、執行器模塊以及配套軟體並構成一個具有特定功能的完整單元,就稱之為一個嵌入式系統或嵌入式應用。
golang4核cpu協程數量
有以下方法:
方法一:使用帶有緩衝的channel的特性
直到緩衝區被填滿後,寫端才會阻塞。
緩衝區被讀空,讀端才會阻塞。
代碼中channel數據結構為什麼定義struct?
因為空結構體變數的內存佔用大小為0,而bool類型內存佔用大小為1,這樣可以更加最大化利用我們伺服器的內存空間。
方法二:使用sync.WaitGroup
WaitGroup對象內部有一個計數器,最初從0開始,它有三個方法:Add(),Done(),Wait()用來控制計數器的數量。
Golang 怎麼得到 CPU 的使用率和可用內存
第一步,創建性能監視器對象:
PerformanceCounter _oPerformanceCounter=new PerformanceCounter(“Processor”,”% Processor Time”,”_Total”);
第二步,獲取CPU使用情況:
float _nVal=_oPerformanceCounter.NextValue();
_nVal中就是當前CPU的使用率了,加上百分號(%)就是使用率的百分比,比如:
string _s=”當前CPU使用率:” + nVal.ToString(“0.0”) + “%”;
Process [] pro;
pro = Process.GetProcesses();
int total=0;
Process temp;
int i;
for(i=0;ipro.Length ;i++)
{
temp =pro[i];
total=temp.PrivateMemorySize +total ;
}
獲得內存的佔用大小
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/184905.html