这些看上去很简单的操作可能影响程序的效率

这些看上去很简单的操作可能影响程序的效率

在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。


分享到:


相關文章: