-
尽量减少堆内存的使用,尽量减少大片内存的申请【减少使用页堆】
-
要进行内存对齐
内存字节对齐主要是用在结构体中,一个较大的结构体,如果能内存对齐的话,就会节省不少的内存使用空间,
这里要提一下,计算机中最小的单位是字节,一个字节等于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 }
-
尽量减少反射的使用,例如不使用标准库的json包,使用fastjson等包,不使用反射来处理多个chan,使用递归的方法来处理chan,递归如果可以尾递归或者不用递归,更好。