在研究SS2的時候,把Source存放到數據庫中,進行角色配置,SS2把這些資源角色讀取到一個Map中
在得到一個URL請求時,使用這個URL遍歷這個Map,查找是否存在這個Key,如果有,則取出對應的角色。
問題就在這個遍歷Map上,源代碼如下
private ConfigAttributeDefinition lookupUrlInMap(Map requestMap, String url) {
Iterator entries = requestMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Object p = entry.getKey();
boolean matched = urlMatcher.pathMatchesUrl(p, url);
if (logger.isDebugEnabled()) {
logger.debug("Candidate is: '" + url + "'; pattern is " + p + "; matched=" + matched);
}
if (matched) {
return (ConfigAttributeDefinition) entry.getValue();
}
}
return null;
}
這個Method中一上來就作遍歷循環,為什么不先利用Map的特性直接先取一次,如果取得到,直接就返回了,
如果取不到,再遍歷查找,這樣可以提高命中率,從而提高性能,如果找不到,這一次的Map查找性能應該
也不是很低吧?
private ConfigAttributeDefinition lookupUrlInMap(Map requestMap, String url) {
ConfigAttributeDefinition cad = (ConfigAttributeDefinition)requestMap.get(url);
if(cad != null) {
return cad;
}
Iterator entries = requestMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Object p = entry.getKey();
boolean matched = urlMatcher.pathMatchesUrl(p, url);
if (logger.isDebugEnabled()) {
logger.debug("Candidate is: '" + url + "'; pattern is " + p + "; matched=" + matched);
}
if (matched) {
return (ConfigAttributeDefinition) entry.getValue();
}
}
return null;
}
當然,這要權衡系統URL配置的特性,諸如xxx*這種類型的配置多的話,還是原來的方式快一點,如果直接xxx
這種方式多得話,我說的方式就要快一些。
總之,沒有最好,只有更好!
posted on 2008-09-02 21:04
藍劍 閱讀(1238)
評論(1) 編輯 收藏