IT技术博客大学习 共学习 共进步
首页 / 鸟窝
IT 2019-08-10 22:15:47 / 累计浏览 13,720

Go Reflect 性能

这篇讲的是Go语言reflect包在带来便利的同时,所付出的性能代价。作者没有停留在理论层面,而是通过一组精心设计的基准测试,量化了不同反射操作与直接操作之间的性能差异。 测试以一个普通的struct类型为例,揭示了几个关键结论:通过反射创建对象比直接new慢约50%;而反射赋值的性能损耗则更为显著。有趣的是,使用FieldByName按字段名赋值比按索引Field赋值慢了近4倍,原因在于前者内部有额外的字段查找循环。 文章指出,反射在需要动态处理通用类型的场景(如json编解码、ORM框架)中不可或缺,但其带来的指令增加和interface{}装箱开销不容忽视。因此,在高性能敏感的场合,可以考虑采用代码生成等方式(如easyjson)来规避反射,实现性能优化。文章通过具体数据与源码示例,为开发者在“便利”与“性能”之间权衡提供了清晰的参考。

IT 2019-07-26 14:09:47 / 累计浏览 1,600

使用 defer 还是不使用 defer?

这篇讲的是Go语言中defer语句的“爱恨情仇”——从最初赞赏它能简化资源清理代码,到发现其性能开销,再到最终理解其适用边界的全过程。 文章首先展示了defer的魅力:它能让锁的获取与释放成对出现,代码清晰且不易出错,因此在标准库中被广泛使用。然而,性能测试揭示了一个关键事实:使用defer释放锁(70.4 ns/op)比直接调用(19.3 ns/op)慢数倍,多个defer叠加时开销更大。这引出了核心矛盾:defer带来的代码简洁性,是以几十纳秒的性能损耗为代价的。 文章进一步探讨了Go官方对此的优化(如1.8版本的改进),并引用了实际案例(如Prometheus项目)。结论并非一刀切地否定defer,而是提出了务实的平衡点:对于大多数业务代码,defer的便利性远胜于其微小开销;但对于高并发下的“热路径”,通过pprof观察到defer成为瓶颈时,手动管理资源释放则是更优选择。简单说,defer并非免费,但它的代价在绝大多数场景下完全值得。

IT 2019-04-08 00:59:05 / 累计浏览 2,160

[译]Go开发中一些有用的模式

作者从使用VB、Java、C#和Python转向Go开发的视角出发,分享了在Go中实现几个经典设计模式的独特方式。文章的核心在于对比:与许多语言依赖注解(Annotation)实现装饰器不同,Go通过函数包装和接口适配来增强功能,使控制流更显式,避免了隐藏的配置陷阱。对于单例模式,Go利用`sync.Once`优雅地解决了其他语言中常见的并发初始化安全与性能问题,甚至结合装饰器模式将不安全的API包装成线程安全版本。此外,文章还介绍了用类型方法实现“静态成员”的技巧,以及如何用带缓冲的channel轻量级模拟信号量。这些示例不仅展示了Go的语法特性,更体现了其通过组合和并发原语来构建清晰、安全代码的哲学,对习惯其他语言范式的开发者很有启发。