這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
比如我們 從1加到100,我們小時候就知道 101*50=5050,這是利用了演算法,但是我們這裡沒有討論演算法,只是驗證電腦的計算能力,在GO語言中,我們這樣設計遍曆。
func main() { ts := time.Now().UnixNano() h := 1000000000 sum := 0 for i := 0; i <= h; i++ { sum = sum + i } fmt.Println(sum) fmt.Print("時間毫秒:") fmt.Println((time.Now().UnixNano() - ts) / 1000000)}
計算結果:
500000000500000000
時間毫秒:289
這樣單線程計算的話,浪費了電腦的多核效能,而且GO的並發就是利用多核,因此我們開闢幾個線程,每個線程計算一段,比如我們要計算1到100等於多少,就可以開闢10個線程,分別計算1-10,10-20等等。
func Count1(start int, end int, ch chan int) { var cccc int for j := start; j < end; j++ { cccc = cccc + j } ch <- cccc}func main() { ts := time.Now().UnixNano() h := 1000000000 sum := 0 ch := make(chan int, 50) numLength := cap(ch) for i := 0; i < numLength; i++ { num := h / numLength go Count1(num*i, num*i+num, ch) } for i := 0; i < numLength; i++ { select { case msg := <-ch: sum = sum + msg } } fmt.Println(sum + h) fmt.Print("時間毫秒:") fmt.Println((time.Now().UnixNano() - ts) / 1000000)}
計算結果:
500000000500000000
時間毫秒:75
可以對比一下,效率提高了4-5倍,因此我們可以推斷,我在網吧用的電腦的cpu核心數大約在4-8核之間,CPU核心數一般是2的次方計算,而且系統不會把CPU的計算能力全部分配我的程式,所以8核最為可靠,(自己沒有電腦,也買不起,在這裡上網6元一個小時,沖100送100,屬於電競區,還可以接受,其他的區間4元一小時),其實也可以看到並沒有完全利用8核全部效能,因為這是系統原因。
看下python
先寫個單線程的列子:這次計算100000000,注意這比上面的GO語言計算數目少了一個0。
import timesum=0ts=time.time()for i in range (100000000): sum=sum+iprint('花費時間:(秒) '+ str( time.time()-ts))
結算結果:
花費時間:(秒) 10.329591035842896
可以對照下,python的遍曆計算能力有點弱,因為它屬於指令碼,每次產生一個對象,所以建立對象消耗的時間過高。
再寫多線程,分段計算:
import threadingimport timets=time.time()mutex = threading.Lock()sumList=[]def Count(start,end): count=0 for i in range(start,end): count = count + i mutex.acquire() sumList.append(int(count)) mutex.release()li = []h=100000000sliceLen=10for i in range(sliceLen): num = int (h / sliceLen) th = threading.Thread(target=Count, args=(num*i,num*i+num)) th.start() li.append(th)for i in li: i.join()print(sum(sumList)+h)print('花費時間:(秒) '+ str( time.time()-ts))
花費時間:(秒) 6.120349884033203
可以看到PYTHON中並沒有真正完全利用多核性,由於GIL的限制,並沒有真正利用多核來計算,不過由於分擔了一些其他的工作,減少了主CPU負擔,因此效能也比單線程提高很多。