這些看上去很簡單的操作可能影響程序的效率

這些看上去很簡單的操作可能影響程序的效率

在Go中,某些操作看上去很簡單,但是卻需要不少開銷。本將列出一些這樣的操作。

1. 字符串轉換為碼點切片

一個從字符串到碼點切片([]rune)轉換的空間複雜度和時間複雜度都為O(n)。而且此能轉換中還需要UTF-8解碼。

同理,len([]rune(aString))是一個時間複雜度都為O(n)的操作,雖然官方標準編譯器對此做了優化,從而避免了O(n)空間複雜度。

2. 字符串轉換為字節切片

一個從字符串到字節切片([]byte)轉換的空間複雜度和時間複雜度也都為O(n)。當然此過程不需要UTF-8解碼。另外需要知道官方標準編譯器做出了一些優化,從而使得在

某些場景下的轉換的空間複雜度和時間複雜度也都為O(1)。

3. 將尺寸較大的值賦給另一個值

賦值過程的時間複雜度和目標值的尺寸成正比。特別地,從非接口值到接口值的賦值常常有可能還需要開闢內存。

因為Go中函數調用中的函數傳參都為值賦值,所以儘量不要使用尺寸較大的類型做為參數類型。

4. 使用雙循環變量for-range遍歷元素類型的尺寸較大的容器值

在這樣的遍歷過程中,每個被遍歷的元素都將被賦值給循環變量。

5. for-range直接遍歷數組

在for-range中,range關鍵字後跟隨的容器值將被複制一份後才開始遍歷。我們應該儘量在range關鍵字後跟隨數組的指針或者從數組派生出來的切片來遍歷數組元素。


關於更多Go語言編程中的事實、細節和技巧,請訪問《Go語言101》官方網站 https://gfw.go101.org (可點擊下面的原文鏈接直接訪問)或者項目地址 https://github.com/golang101/golang101。


分享到:


相關文章: