硬件限制
引用摩爾定律正在失效 第一個具有3.0GHz時鐘速度的Pentium 4處理器是由英特爾于2004年推出的。 而今天,我的Mackbook Pro 2016的CPU時鐘速度為2.9GHz。 可以看到在過去的十年中,CPU處理能力沒有太大的進(jìn)步。 您可以在下面的圖表中看到這一點。

從上面的圖表可以看出,單線程的性能和處理器的頻率在過去的十年內(nèi)保持平穩(wěn)。如果你認(rèn)為添加更多的晶體管是解決方案,那么你錯了。這是因為在較小的尺度上一些量子性質(zhì)開始出現(xiàn)(如隧道,因為它實際上用掉更多的更多的晶體管(為什么?)并且添加晶體管的性價比在下降。 所以制造商開始向處理器添加越來越多的核心?,F(xiàn)在我們有四核和八核CPU可用。 同時我們還引入了超線程。還向處理器添加更多緩存以提高性能。 但上述解決方案也有其局限性。我們不能向處理器添加更多的緩存以提高性能,因為緩存具有物理限制:緩存越大,緩存越慢。向處理器添加更多核心也具有成本。此外,這都不能無限擴展。這些多核處理器可以同時運行多個線程,并在紙面上帶來并發(fā)性。我們稍后將討論這一問題。 所以,如果我們不能完全依靠硬件的改進(jìn)來提升性能,更高效的軟件也是我們需要考慮的手段。但遺憾的是,現(xiàn)代編程語言并不高效。
Go has goroutines!!
如上所述,硬件制造商正在向處理器添加越來越多的核心以提高性能。使用這些處理器的所有數(shù)據(jù)中心,在未來幾年內(nèi)核數(shù)量將會大大增加。更重要的是,今天的應(yīng)用程序使用多個微服務(wù)來維護(hù)數(shù)據(jù)庫連接,消息隊列和緩存。因此,我們開發(fā)的軟件和編程語言應(yīng)該輕松支持并發(fā)性,并且它們應(yīng)該隨著核心數(shù)量的增加而輕松擴展。 但是,大多數(shù)現(xiàn)代編程語言(如Java,Python等)發(fā)明于90年代的單線程環(huán)境。當(dāng)然這并不意味著他們不支持多線程(譯者的話Python確實不支持多線程)。大多數(shù)編程語言支持多線程。真正的問題來自并發(fā)執(zhí)行和線程鎖,競爭條件和死鎖。這些東西使得在這些語言上創(chuàng)建多線程應(yīng)用程序很困難。 例如,在Java中創(chuàng)建新線程會消耗大約1MB的內(nèi)存堆大小。最終如果你創(chuàng)建了數(shù)千個線程,這將對堆內(nèi)存造成巨大的壓力,并將由于內(nèi)存不足而被操作系統(tǒng)殺死。此外,如果你想在兩個或多個線程之間進(jìn)行通信,也比較困難。 另一方面,Go在2009年發(fā)布時,多核處理器已經(jīng)流行起來。這就是為什么GoLang以并發(fā)為第一要務(wù)。 Go使用goroutines而不是線程。新建goroutine只使用近2KB的內(nèi)存,你可以創(chuàng)建數(shù)百萬goroutine。

當(dāng)然還有其他的好處:
- 具有可增長的分段堆。這意味著他們只在需要時才使用更多的內(nèi)存。
- Goroutines的啟動時間比線程快。
- Goroutines帶有內(nèi)置的原語,以便在它們之間(channel)安全地通信。
- Goroutines允許您避免在共享數(shù)據(jù)結(jié)構(gòu)時使用互斥鎖。
- 此外,goroutines和OS線程不是1:1映射。 單個goroutine可以在多個線程上運行。 Goroutine被復(fù)用到少量的OS線程中。

Go直接運行在硬件上
使用C,C ++的一個最大的好處是它們的性能比其他現(xiàn)代高級語言(如Java / Python)更強。 因為C / C ++是編譯執(zhí)行而不是解釋執(zhí)行的。 當(dāng)您使用Java或其他基于JVM的語言構(gòu)建應(yīng)用程序時,它將代碼編譯為字節(jié)碼,在執(zhí)行時,JVM解釋字節(jié)碼并將其轉(zhuǎn)換為處理器可以理解的二進(jìn)制代碼。
