Skip to content

Latest commit

 

History

History
35 lines (26 loc) · 1.89 KB

better.md

File metadata and controls

35 lines (26 loc) · 1.89 KB

go语言代码的性能优化

  1. 尽量减少堆内存的使用,尽量减少大片内存的申请【减少使用页堆】

  2. 要进行内存对齐

    内存字节对齐主要是用在结构体中,一个较大的结构体,如果能内存对齐的话,就会节省不少的内存使用空间,

    这里要提一下,计算机中最小的单位是字节,一个字节等于8位,但是,1位仍然是一个字节,因为最小的单位是字节,不存在0.125个字节这种说法。

    我们使用unsafe.Sizeof()来获取类型的大小

    所以说bool类型,虽然就一位,但是它是1个字节。int类型在64位的计算机中,它就是64 / 8 = 8个字节,string 是16个字节,主要包括了,一个指针类型8个字节(unptr,其实这个家伙就是uint8)一个byte类型 8个字节(还是uint8)所以一共是16个字节,slice类型,一个指针和一个一个length【8个字节的uint8】一个cap【8个字节】所以slice类型是24个字节【这仅仅是slice类型,还没有装数据呢】,map是8个字节,就一个指针【说明底层结构体中没有len和cap】

    这里我们要知道一个不占内存的数据,就是struct{} 它是0字节,所以说一个空的结构体是没有大小的,小tips,go里面没有set,可以用空结构体作为map的value,就可以充当一个set类型了。

    下面演示一下内存对齐:

    这是没有对齐的时候

    type a struct {
        a int8
        b int32
        c int16
    }

    下面是对齐的时候

    type a struct {
        a int8
        c int16
        b int32
    }
  3. 尽量减少反射的使用,例如不使用标准库的json包,使用fastjson等包,不使用反射来处理多个chan,使用递归的方法来处理chan,递归如果可以尾递归或者不用递归,更好。