Go 频繁的进行断言以及通过接口调用方法有性能消耗吗?

如题

  1. 结构体实现了某一个接口,那后续平凡对该结构体进行断言性能消耗大吗
  2. 通过接口调用实现该结构体的方法有额外性能消耗吗

网上好像没有什么文章进行说明

阅读 7.6k
2 个回答

简单粗暴的结论:

断言不会消耗多少性能,可以忽略。通过接口调用,不在代码中显示使用断言会有额外的性能消耗,并且消耗较大。

原因:
接口调用的代码无法在编译器确定参数类型,因此编译器无法进行内联优化。详细见:
https://mp.weixin.qq.com/s/1n...

首先,网上有文章,go相关的都可以看这个人的文章,写的很好
golang接口动态派发

不想看文章直接看结论

在接口实现为结构体指针的情况下:

  • 在关闭编译器优化的情况时,动态派发生成的指令会带来 ~18% 左右的额外性能开销。
  • 这些性能开销在一个复杂的系统中不会带来太多的影响。一个项目不可能只使用动态派发,而且如果我们开启编译器优化后,动态派发的额外开销会降低至 ~5%,这对应用性能的整体影响就更小了,所以与使用接口带来的好处相比,动态派发的额外开销往往可以忽略

在为结构体实现时:

  • 使用结构体来实现接口带来的开销会大于使用指针实现,而动态派发在结构体上的表现非常差,这也提醒我们应当尽量避免使用结构体类型实现接口
推荐问题