翻譯原文鏈接? ?轉帖/轉載請注明出處
英文原文鏈接? ?發表于2014/06/07
我最近受邀在Gocon會議上做了一個演講。Gocon是一個非常棒的,每半年一次在日本東京舉行的Go會議。Gocon 2014是完全由社區舉辦的一整天活動。它包括了培訓以及一個下午的演講。演講的主題主要圍繞在Go語言在線上環境中的應用。
以下是我的演講稿。原始的演講稿強調慢而清楚的演講,所以我做了略微的修改使得它更具可讀性。
這里我要感謝Bill Kennedy,Minux Ma,特別是Josh Bleecher Snyder。Josh為準備這次演講給予了很多的幫助。
-------------------------------------------------------------------------------------
下午好,我的名字叫David。我很高興今天能夠參加Gocon會議。我兩年前就打算要參加這個會議,非常感謝會議組織者給我這個演講的機會。我想讓我的演講以一個問題開始。
為什么大家選擇使用Go語言?
如果大家正打算學習Go語言,或者在產品里使用Go語言,他們對這個問題會有各種各樣的答案。但有3個答案被提及的次數最多。這三個答案是:
首先是并發:Go語言對并發編程有很好的支持。這對許多使用單線程腳本語言(例如Nodejs,Ruby或者是Python)的程序員來說是非常有吸引力的。對C++或者Java的程序員來說,因為這些語言里線程的使用開銷比較大,也是有吸引力的。
便捷的部署:Go編譯出來的程序可以被很簡單地部署出去。這一點我們已經從很多Go語言的使用者這里得到認可。
最后就是性能。我相信人們使用Go語言最重要的原因就是因為它很快。
我今天就來討論下對Go語言性能有所幫助的5個特性。我還將和你們分享Go語言實現這些特性的細節。
變量的處理和存儲
我要討論的第一個特性就是Go語言是如何高效的處理和存儲變量的。這里有一個Go語言變量的例子。編譯以后,變量gocon占了正好4個字節的內存。
我們來和其他語言做個比較
由于Python在變量表示上的額外損耗,它存儲同樣的值需要6倍的內存。這些額外的開銷被Python用來記錄類型信息,引用計數(reference counting)等等。
我們再來看另外一個例子:
和Go語言相似,Java的int類型也使用4個字節的存儲空間。但是要在如List或者Map這樣的集合里存儲int的話,編譯器必須把它轉換成Integer對象。
所以Java里的整數類型更多時候如上圖所示。它需要占用16到24個字節的內存。
為什么剛才所說的很重要?現在的計算機內存很便宜而且容量也很大,為什么這點額外的開銷值得關注呢?
下面這張圖顯示了CPU主頻和內存帶寬速度的比較。你可以注意到CPU主頻速度和內存帶寬的速度之間的差距正在一直變大。
上圖兩條曲線之間的差距正是CPU花費了多少時間在等待內存數據。從60年代后期開始,CPU的設計師們已經認識到了這個問題。他們的解決方法是在CPU和主內存之間添加了緩存。緩存本質上就是一塊面積更小,但是更快的內存。
下面圖中定義的是一個Location類型,用來存儲某個三維空間里物體的坐標。它是用Go語言寫的,所以每個這樣的Location結構正好占用24個字節的存儲空間。
我們可以用這個類型來構建一個包含1000個location的數組,它正好占用24000字節的內存。在這個數組里,這些Location結構是在內存中連續分布的,而不是1000個指向隨機存儲的Location結構的指針。這非常重要,因為所有這1000個Location結構在緩存里是連續存儲的,并且他們占用的空間非常緊湊。
Go語言讓你定義非常緊湊的數據結構,避免了無謂的指針跳轉。緊湊的數據結構能夠使緩存更加有效。高效的緩存最終給我們帶來了更高的效率。