先週のおバカコード

なんかパフォーマンス試験したら、めちゃ遅。つうことで発掘。

java.util.List list = new java.util.ArrayList();
for (int i = 0; i < result.length; i++) {
  String id = result[i].get(hoge) + ":" + result[i].get(hage);
  if (list.contains(id)) {
    continue;
  }
  hasRights[i] = true;
  list.add(id);
}

え〜っと、試験だとresult.lengthが10000になるので、最後のほうだと10000のものとの一致を見ることになるのですが、Listという入れ物の型にだまされて気づきませんでした。ArrayListは単なる配列ですから、contains()は順番に比較していく訳で。ここ全体で5秒以上かかっておりました。原因がわかったので改修。

java.util.Set seen = new java.util.HashSet(result.length * 2);
for (int i = 0; i < result.length; i++) {
  String id = result[i].get(hoge) + ":" + result[i].get(hage);
  if (!seen.add(id)) {
    continue;
  }
  hasRights[i] = true;
}