我有一个程序,可以从内存映射中读取 173 (c) 个数据结构,这些数据结构需要转换为 Go。类型的值作为字符串存储在这些结构中。每秒接收该结构 60 次。
我现在使用反射(FieldByName)来获取对 go struct 字段的引用并设置接收到的数据。但是因为有很多字段(173)并且它们更新了很多,所以这增加了很多开销,并且该函数调用是我的程序中最慢的部分(jay go prof!)。
加快速度的最佳方法是什么?据我所知,我有三个选择:
reflect.Value在映射中并创建一个接收数据的函数,使用绑定到缓存映射的模板结构,填充该结构并返回该模板结构的副本go generate每个接收字段的所有设置器和一个巨大的 switch 语句什么是“最好”的选择?有一个我忽略的选项吗?
对于#1,为了并发安全,您需要一个“模板结构”池或至少一个保护它的互斥体。这会增加一些开销并且调试起来可能很棘手。
#3 的维护是一场噩梦。
我会选择#2。运行的代码将是快速的、并发安全的并且易于调试。设置工具后,结构中的更改只需要运行命令行来更新设置器。
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |