//map是一个hashmap<String, Role>
public String saveRole(final Role role)
{
String username = role.getUsername();
Role r = map.get(username);
if(r != null)
{
map.put(username, role);
return "0";
}
return "-1";
}
ROLE是用Socket传送过来的对象。
这个函数执行5000次基本上要花费20秒。
如果把 map.put(username, role);注释掉。5000次瞬间完成求解。。真奇怪的问题。想半天没想明白
map中存在相同的key就覆盖它,不存在就不放
不是存在相同key保存,而是username不为null的保存,而且是覆盖式的保存一个role对象大概占用多少内存?5000个大概看看占用多少内存?
怎么测试函数执行时间的?确定时间是耗在这个函数上?还是整个处理过程的时间慢了?
话说我的KEY是一个String...要覆盖的话比较的也是KEY啊。
使用集合:HashMapHashMap 里面有这样一个构造:HashMap(int initialCapacity, float loadFactor)
initialCapacity->初始容量:哈希表中桶的数量,初始容量只是哈希表在创建时的容量。
loadFactor->加载因子:希表在其容量自动增加之前可以达到多满的一种尺度。
当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。 看你的初始化都没有设置这两个参数,所以都选择默认值(容量是16,加载因子是0.75f)你这里是5000次,你自己计算一下。你的容器要rehash多少次。。初始化的时候把容量加上你试试多少时间,然后在加上加载因子
map = new HashMap<String, Role>(5000);注:如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 如果不想rehash一次。可以自己计算一下。。
现函数改为:@Override
public String saveRole(Role role)
{
String result = "-1";
String token = tokens.get(role.getUsername());
RoleInfo info = userInfos.get(token);
if(info != null)
{
info.role = role;
this.savaToCacheThread.add(role);
result = "0";
}
return result;
}
把info.role = role;注释掉。函数瞬间完成,否则超慢。。
求解啊。
{
map.put(username, role);
return "0";
}因为每次字符串的指向都要“断开-连接”,所以代码性能很低。
Map map = new HashMap<String, Integer>();
long start = System.currentTimeMillis();
for(int i = 0; i < 5000; i++) {
map.put("abcdefg" + 1, Integer.valueOf(i));
}
long end = System.currentTimeMillis();
System.out.println(end - start);我用这段测试了下 值用16ms啊我觉得你应该把你那段改为
public boolean saveRole(Role role) {
String username = role.getUsername();
if(username != null)
{
map.put(username, role);
return true;
}
return false;
}
你用户名为不为null的时候加入到map,也是应该判断用户名啊
而且你要返回2值做成功与否的话,一般还是返回boolean类型吧
LZ自己用javap看一下代码指令
javap -verbose your_class