解决反射开销的最佳方法是什么?

Leo*_*eon 2 reflection go

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

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

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

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

什么是“最好”的选择?有一个我忽略的选项吗?

Hec*_*orJ 5

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

#3 的维护是一场噩梦。

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