剖析使Go語言高效的5個特性(1/5): 變量的處理和存儲

翻譯原文連接 轉帖/轉載請註明出處程序員

英文原文連接 發表於2014/06/07編程

我最近受邀在Gocon會議上作了一個演講。Gocon是一個很是棒的,每半年一次在日本東京舉行的Go會議。Gocon 2014是徹底由社區舉辦的一成天活動。它包括了培訓以及一個下午的演講。演講的主題主要圍繞在Go語言在線上環境中的應用。數組

如下是個人演講稿。原始的演講稿強調慢而清楚的演講,因此我作了略微的修改使得它更具可讀性。緩存

這裏我要感謝Bill Kennedy,Minux Ma,特別是Josh Bleecher Snyder。Josh爲準備此次演講給予了不少的幫助。數據結構


下午好,個人名字叫David。我很高興今天可以參加Gocon會議。我兩年前就打算要參加這個會議,很是感謝會議組織者給我這個演講的機會。我想讓個人演講以一個問題開始。併發

圖片描述

爲何你們選擇使用Go語言?post

若是你們正打算學習Go語言,或者在產品裏使用Go語言,他們對這個問題會有各類各樣的答案。但有3個答案被說起的次數最多。這三個答案是:性能

圖片描述

首先是併發:Go語言對並行編程有很好的支持。這對許多使用單線程腳本語言(例如Nodejs,Ruby或者是Python)的程序員來講是很是有吸引力的。對C++或者Java的程序員來講,由於這些語言裏線程的使用開銷比較大,也是有吸引力的。學習

便捷的部署:Go編譯出來的程序能夠被很簡單地部署出去。這一點咱們已經從不少Go語言的使用者這裏獲得承認。spa

最後就是性能。我相信人們使用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語言讓你定義很是緊湊的數據結構,避免了無謂的指針跳轉。緊湊的數據結構可以使緩存更加有效。高效的緩存最終給咱們帶來了更高的效率。

相關文章
相關標籤/搜索