Java與Go語言的學習成本相差多少?
go語言入門特別容易,熟悉c/c++和匯編的人精通go特別快,Java入門一般,但是精通也不是很容易,
go入門簡單但是精通難。go編譯后是匯編代碼,Java編譯后是Java字節碼。理解go的底層可以寫出很高效的代碼。Java需要解釋執行。兩者性能差不多,但對于純計算go會更好一些。因為如果不調用任何函數,是不會引起go的協程切換的,此時該計算代碼會獨占cpu,且由于是匯編代碼(不調用庫函數情況下生成的匯編和c語言是一樣的)因此性能極佳。go語言的函數編譯器會在函數開始位置插入一段代碼,這段代碼會判斷當前棧空間是否夠用,如果不夠用就會擴展,同時如果檢測到當前協程被標記為可搶占,那么就會切換到下一個協程,這個搶占標記是由一個獨立線程每隔20us-10ms進行檢測維護的,全局同時運行的協程是多個分別從不同的p結構體中獲取。這就是為什么如果不顯示或者隱式調用任何函數時,是不會出發協程切換,這就意味著該協程單獨占用一個操作系統線程。而且go語言的編譯器和運行時管理函數都是用c和匯編寫的。從上面的特性來看,go在編寫并發程序時特別簡單方便,而且遇到io阻塞時性能遠遠大于Java,原理決定了這些特性,Java用的是操作系統線程,因此對于阻塞的io線程會白白浪費掉時間片,同時頻繁的線程切換會導致cpu緩存命中率低下,這些都會影響性能。而go的協程在一定程度上減弱了這些影響。而且對于計算密集任務合理利用go的機制也能使性能極高。很多對于go、c、rust的性能測試過于膚淺并未利用go的機制,導致看起來性能和rust差距不小,但是合理利用這些機制則差距很小。