同僚があるプログラムの実行速度が遅いので困っていました。
プログラムの問題点をすっごく簡単にするとこんな感じ。
public void piyo(List<Hoge> hogeList, List<Fuga> fugaList){
for(Fuga fuga : fugaList){
for(Hoge hoge : hogeList){
if(hoge.getKey().equals(fuga.getKey())){
something(hoge);
break;
}
}
}
}
どう見ても二重ループが悪い。
なのでMapを使ったらいいんじゃないの?って提案したんですね。
※Hoge.getKey()はユニークで重複しないInteger型の前提
public void piyo(List<Hoge> hogeList, List<Fuga> fugaList){
Map<Integer, Hoge> hogeMap = new HashMap<Integer, Hoge>(hogeList.size());
for(Hoge hoge : hogeList){
hogeMap.put(hoge.getKey(), hoge);
}
for(Fuga fuga : fugaList){
if(hogeMap.containsKey(fuga.getKey())){
something(hogeMap.get(fuga.getKey()));
}
}
}
無事、性能は改善されました。めでたしめでたし。
って感じでオチもなんもないんだけど、Mapって早いし便利じゃないですか。
性能的に心配ならもっと積極的に使っていってほしいんですけど、
それともなにか私の知らない強烈なデメリットがあったりするのでしょうか。。。
以下、ねんのため検証
public static void main(String[] args) {
List<Hoge> hogeList = new ArrayList<Hoge>();
List<Fuga> fugaList = new ArrayList<Fuga>();
for(int i=0; i < 10000; i++){
hogeList.add(new Hoge(i+1));
fugaList.add(new Fuga(10000-i));
}
long t = System.currentTimeMillis();
piyo(hogeList, fugaList);
System.out.println(System.currentTimeMillis() - t);
}
| 修正前 | 修正後 |
|---|---|
| 1496ms | 80ms |
| 1439ms | 69ms |
| 1448ms | 72ms |
うん、やっぱ早いよなあ。