比如我们 从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 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负担,因此性能也比单线程提高很多。
有疑问加站长微信联系(非本文作者)