作者cloderw (漫云端)
看板mud_sanc
标题Re: [wizs] 字串比大小程式
时间Tue Feb 10 17:16:28 2009
: 这样就可以把玩家的 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
1F:推 happyhero :推! 有种矛塞顿开的感觉@O@ 02/10 20:56
3F:推 laechan :对了大家可参考上面(我从来没认真看过那些XDDD) 02/10 21:03