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

时间:2015-11-13 22:08:25

标签: reflection go

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

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

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

  1. 在地图中缓存reflect.Value并创建一个接收数据的函数,使用绑定到缓存映射的模板结构,填充该结构并返回该模板结构的副本
  2. go generate所有setter和每个接收字段的巨型switch语句
  3. 只需编写所有不同的setter
  4. 什么是“最佳”选项?我有一个选择吗?

1 个答案:

答案 0 :(得分:3)

对于#1,要保证并发安全,你需要一个这样的池" template-struct"或者至少是保护它的互斥体。这增加了一些开销,调试起来很棘手。

#3是维持的噩梦。

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