在研究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
蓝剑 阅读(1235)
评论(1) 编辑 收藏