力不從心的Celestia
How I cut GTA Online loading times by 70%
GTA Online 載入時間比起故事模式要長得多(360 秒 v.s. 70 秒),有人終於抓狂而開始爬原因惹
- GTA Online 啟動時有一個單執行緒 CPU 瓶頸
- 這個瓶頸在解析一個 10 MB 的 JSON 檔案
- 其 JSON 解析器解析字串效率不好
在使用 sscanf 解析字串的時候會一個字元一個字元的比對,每次要找同一個 key 時重新解析又要重複做這件事情...
- 然後有個很爛的重複數據檢查機制
明明每個物件都有獨立的 hash,為啥要用 array 而不用 hash map 儲存物件?而這導致每次檢查 key 是否存在都要重新跑過整個 array...更別提事後檢查,JSON 中每個物件都是唯一的...
Hey Man BOT
掰噗~
(cozy)
力不從心的Celestia
作者在能做到的範圍內的解法:
1. 由於用 sscanf 解析時會呼叫 strlen,而這個操作花了很多時間。所以作者弄了一個 cache 紀錄字串開始的 pointer 跟字串長度,如果要找一樣的位置的話就可以直接回傳已經 cache 的長度;
2. 由於事後檢查 JSON 中所有物件都是唯一的,所以作者乾脆拿掉了重複物件檢查
力不從心的Celestia
而原本需要六分鐘的載入時間經過了這些修改後,載入時間就只需要不到兩分鐘了
載入新的回覆