在研究SS的时候把Source存放到数据库中进行角色配置SS把这些资源角色读取到一个Map中在得到一个URL请求时使用这个URL遍历这个Map查找是否存在这个Key如果有则取出对应的角色
问题就在这个遍历Map上源代码如下
privateConfigAttributeDefinitionlookupUrlInMap(MaprequestMapStringurl){
Iteratorentries=requestMapentrySet(erator();
while(entrieshasNext()){
MapEntryentry=(MapEntry)entriesnext();
Objectp=entrygetKey();
booleanmatched=urlMatcherpathMatchesUrl(purl);
if(loggerisDebugEnabled()){
loggerdebug(Candidateis:+url+;patternis+p+;matched=+matched);
}
if(matched){
return(ConfigAttributeDefinition)entrygetValue();
}
}
returnnull;
}
return null}这个Method中一上来就作遍历循环为什么不先利用Map的特性直接先取一次如果取得到直接就返回了如果取不到再遍历查找这样可以提高命中率从而提高性能如果找不到这一次的Map查找性能应该也不是很低吧?
privateConfigAttributeDefinitionlookupUrlInMap(MaprequestMapStringurl){
ConfigAttributeDefinition cad = (ConfigAttributeDefinition)requestMapget(url);
if(cad != null) {
return cad;
}
Iteratorentries=requestMapentrySet(erator();
while(entrieshasNext()){
MapEntryentry=(MapEntry)entriesnext();
Objectp=entrygetKey();
booleanmatched=urlMatcherpathMatchesUrl(purl);
if(loggerisDebugEnabled()){
loggerdebug(Candidateis:+url+;patternis+p+;matched=+matched);
}
if(matched){
return(ConfigAttributeDefinition)entrygetValue();
}
}
returnnull;
}
当然这要权衡系统URL配置的特性诸如xxx*这种类型的配置多的话还是原来的方式快一点如果直接xxx这种方式多得话我说的方式就要快一些
总之没有最好只有更好!