Golang接口及空接口性能测试
由于golang缺乏泛型,在许多情况下,为了代码的灵活性,难免要用到接口甚至空接口,而在对空接口中的数据进行操作之前,通常有一个类型断言的过程。我们经常听到一些“Golang”的反射性能很低的言论,那么与类型操作有关的类型断言这个操作性能到底如何呢?不妨来作一个Benchmark
定义四种操作场景
以下定义了一个类型和一个接口,分别以四种方法 具体类型
,接口
, 空接口->具体类型
, 空接口->接口
对一组数据进行求和(遍历)
|
|
Benchmark 测试函数
|
|
运行测试
|
|
结果有些意外,Golang推崇的接口操作相比直接操作具体类型多出4倍多时间, 更意外的是空接口
+断言
意外比正常接口要快很多!!! 只是比具体类型多出不到一倍的时间。 最后,空接口
转接口
后再调用方法是最慢的,相较接口又多出4倍多(较直接操作具体类型多出20倍多时间),这种场景现实中其实是有使用场景的,如此看来需要尽量在性能敏感的地方避免。
其它
最后,我还测试了直接用Num
实现Numer
,而不是用指针*Num
实现Numer
,结果也有微小的差异,其它情况不变的情况下,Benchmark下来成绩大概是:
如此看来使用指针实现接口性能可以高 15%-20%之间, 还是不可忽略的。