Go 的 panic 和 recover 的成本

主要观点:

  • 《Effective Java》中的一些智慧对 Go 语言有参考价值。
  • panicrecover应仅用于异常情况,滥用会降低执行速度、产生堆分配且阻止内联。
  • Go 语言设计者有意避免像 Java 那样的异常系统,但新手可能会滥用panicrecover
  • ClimbAllPanicRecover(滥用panicrecover的函数)比ClimbAll(更惯用的函数)在小输入切片时速度慢,开销不可忽视,每次调用会产生 24 字节的堆分配,且recover会阻止内联,编译器不能消除ClimbAllPanicRecover中的边界检查。
  • 内部处理失败情况时使用panicrecover有便捷性和性能提升的动机,但不应过度滥用,需用注释和基准测试结果说明设计决策,并将其作为包的实现细节。

关键信息:

  • Java 中滥用异常用于控制流的例子及解释。
  • Go 中模拟该例子的代码及相关性能测试结果。
  • 内部处理失败情况时使用panicrecover的利弊。

重要细节:

  • ArrayIndexOutOfBoundsException及相关代码示例。
  • Go 语言中go:noinline指令及对函数内联的影响。
  • 关于panicrecover在不同情况下对性能的影响及具体案例。
  • panicrecover的使用建议及注意事项。
阅读 7
0 条评论