【问题标题】:What is the best way to work around the overhead of reflection?解决反射开销的最佳方法是什么?
【发布时间】:2016-02-15 14:44:14
【问题描述】:

我有一个程序从需要转换为 Go 的内存映射中读取 173 (c) 个数据结构。类型的值作为字符串存储在这些结构中。每秒接收 60 次结构。

我现在使用反射 (FieldByName) 来获取对 go struct 字段的引用并设置接收到的数据。但是因为有很多字段 (173) 并且它们会更新很多,所以这会带来很多开销,并且该函数调用是我程序中最慢的部分 (jay go prof!)。

加快速度的最佳方法是什么?据我所知,我有三个选择:

  1. 在映射中缓存reflect.Value 并创建一个接收数据的函数,使用绑定到缓存映射的模板结构,填充该结构并返回该模板结构的副本
  2. go generate 所有设置器和每个接收字段的巨大 switch 语句
  3. 只需对所有不同的设置器进行编码

什么是“最佳”选项?有没有我忽略的选项?

【问题讨论】:

    标签: reflection go


    【解决方案1】:

    对于#1,为了并发安全,您需要一个“模板结构”池或至少一个保护它的互斥锁。这会增加一些开销,并且可能很难调试。

    #3 是维护的噩梦。

    我会选择#2。运行代码将快速、并发安全且易于调试。 设置工具后,更改结构只需运行命令行来更新设置器。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2019-10-05
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      相关资源
      最近更新 更多