2015-11-13 102 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。

相關問題