不少玩家抱怨 GTA V 的線上版本遊戲讀取速度太慢,而有黑客終於忍不住手,使用工具查明讀碟過慢的原因。最後發現竟是程式碼一個函數設置失誤,令到處理器處理多達 4 分多鐘,總共實行了 19.8 億次多餘的指令!
這名沒有留下身份訊息的黑客,發現在他的電腦上,使用了 6 分鐘才能進入 GTA V Online。當中有 4 分多鐘程式嚴重耗用了處理器資源,於是悖使用了 Luke Stackwalker 處理器任務分析工具,發現在讀碟過程中,有兩個函數佔用大量處理器資源。再往下找,他找到了一個名為「sscanf」的函數,它的功能是讀取格式化的字符串中的資料。在 GTA V 這個函數需要讀取約 63000 多個 JSON 檔案,容量在 10MB 左右。
不過此函數卻出現嚴重程式錯誤,第一個問題是程式需要讀取這 10MB 檔案的每一個字符,再傳回結果,一字不漏的完成掃描此10MB 檔案。
另一個問題是程式會把 63000 多個字串儲存回到一個名為「item」的對象。然而程式卻出現一個不名的繁複動作:程式每次儲存數值到「item」之前,一個 if 指令逐一比較 item 內所有項目 hash 值,檢查是否出現在某一個列表中。
黑客計算這個 if 動作,將要實行(63000^2+63000)/2 次,即等如 19.8 億次。他極懷疑程式設計,為何不用hash map去取代此繁複的工作。
這位黑客更改了此兩個程式的設計1)不讀取63000多個字串的每個字符,只讀取字串的長度 2)跳過重複的檢查,利用hash map插入項目。結果他令 GTA V Online 的讀取時間由 6 分鐘變成 1 分 50 秒。
目前他把反組譯工具上傳到 GitHub 分享,不過由於每款遊戲都會表明不容許玩家自行反組譯遊戲程式,故各位最好還是乖乖等候廠方的更新吧。
資料來源:NEE