2015-11-13 138 views
2

我有一个程序,从需要转换为Go的内存映射读取173(c)数据结构。类型的值在这些结构中作为字符串存储。该结构每秒接收60次。解决反射开销的最佳方法是什么?

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

使这个更快的最佳方法是什么?至于我可以看到我有三个选项:

  1. 缓存reflect.Value的地图中,并接收数据的功能,使用模板结构依赖于缓存地图,填补结构和返回副本该模板结构
  2. go generate所有的setter和一个巨大的switch语句为每个接收现场
  3. 只是所有代码的不同制定者的

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

回答

3

#1,为了保证并发性,你需要一个“template-struct”池或至少一个互斥体来保护它。这会增加一些开销,并且调试起来可能会很棘手。

#3是维护的噩梦。

我会去#2。正在运行的代码将很快,并发安全且易于调试。 一旦你的工具安装好了,你的结构中的改变只需要运行一个命令行来更新setters。

相关问题