好比咱們 從1加到100,咱們小時候就知道 101*50=5050,這是利用了算法,可是咱們這裏沒有討論算法,只是驗證計算機的計算能力,在GO語言中,咱們這樣設計遍歷。python
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等等。app
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) }
計算結果:性能
500000000500000000ui
時間毫秒:75spa
能夠對比一下,效率提升了4-5倍,所以咱們能夠推斷,我在網吧用的計算機的cpu核數大約在4-8核之間,CPU核數通常是2的次方計算,並且系統不會把CPU的計算能力所有分配個人程序,因此8核最爲可靠,(本身沒有電腦,也買不起,在這裏上網6元一個小時,衝100送100,屬於電競區,還能夠接受,其餘的區間4元一小時),其實也能夠看到並無徹底利用8核所有性能,由於這是系統緣由。線程
看下python設計
先寫個單線程的列子:此次計算100000000,注意這比上面的GO語言計算數目少了一個0。
import time sum=0 ts=time.time() for i in range (100000000): sum=sum+i print('花費時間:(秒) '+ str( time.time()-ts))
結算結果:
花費時間:(秒) 10.329591035842896
能夠對照下,python的遍歷計算能力有點弱,由於它屬於腳本,每次生成一個對象,因此建立對象消耗的時間太高。
再寫多線程,分段計算:
import threading import time ts=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=100000000 sliceLen=10 for 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負擔,所以性能也比單線程提升不少。