Re: [wizs] 字串比大小程式
: 這樣就可以把玩家的 id 依字串大小 sort。
: 上面的程式還可以考量系統負擔再改寫,留給各位 wiz 思考。
: 不過考量到可能出現的錯誤,則也必須再改的完整一點,這個
: 各位 wiz 也可以思考。
: Laechan
sort_array 本身是不斷地帶入陣列中的兩個元素做比對
因此若陣列元素有 N 個,sort_names 就會被執行 N x N-1 次(不跟自己比較)
也因此陣列元素數量愈多,sort_array 效能就會大符下降
因此在撰寫 sort_names 等比較函式時,必須盡量的最佳化
單就排序玩家名稱的部份,若想進一步提高效率
可以先用 map() 這個 efun 將所有玩家的名稱一次 query 出來
建立一個存滿所有玩家名稱的字串陣列 allnames
string *allnames = map(users(), (: $1->query("name") :))
然後再將 allnames 丟進 sort_array 排序
如此就可以馬上減少 sort_names 中 N x N-1 次的 ob->query() 執行
假設 N = 100, 每次執行 sort_names 所損耗的執行時間為 1ms
這樣做馬上就可以減少 100x(100-1)*1ms = 9900ms = 9.9sec
可以大幅提升效能(當然 sort_names 應該不會花到 1ms 那麼誇張啦..XD)
另外單純比對字串的話
可以直接使用 strcmp() 這個 efun 來取代自己寫的 sort_names 函式
但 strcmp 只能單純依照固定的字母順序排序,缺乏變化
需要特殊條件的排序就還是得自己撰寫 sort_names 函式
像是名稱中包括色碼等隱藏碼,就會需要另外進行過濾處理
僅供參考...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.50.65
推
02/10 20:56, , 1F
02/10 20:56, 1F
推
02/10 21:02, , 2F
02/10 21:02, 2F
推
02/10 21:03, , 3F
02/10 21:03, 3F
討論串 (同標題文章)