2009年9月16日水曜日

JavaのHashtableクラスを使ったことがありますか?

プログラムのパフォーマンスを向上する手法としてハッシュテーブルがありますが、Javaには、Hashtableというクラスがあり、これを上手く利用するとパフォーマンスを向上させることができます。

Hashtableは、あるキー(文字列)に対する値を保持するものです。通常のテーブルでは、テーブル内のキーから値を取り出す場合には、テーブルの順にキーと同じエントリを探して、見つかったらその値を返却することになります。しかし、この方法だとテーブルのエントリが増えてくると、検索までに多くの時間がかかってしまいます。
ハッシュテーブルは、キー(文字列)から自動的にハッシュ値とよばれる値を計算し、この計算値と使って直接値を取り出す方式で、テーブルのエントリが増えても、通常のテーブルに比べてパフォーマンスが低下することはありません。

昔は、ハッシュテーブルの処理を自分で作る必要がありました。しかし、Javaでは、予めハッシュテーブルが用意されており、このHashtableを利用することでパフォーマンスの向上が見込めます。

私が作ったプログラムでは、あるメソッドで、何かの値を計算する処理があり、このメソッドが何回も呼ばれるケースで、以下のようなコーディングを使ってパフォーマンスを改善することができました。

hash =  new Hashtable(); // Hashtableクラスのインスタンス変数hashを設定しておく

// p1とp2を使って文字列型のValueを返却するメソッドでの使用例
public String getValue(int p1, int p2) {
String value;
String key = "getValue:"+p1+":"+p2;

if(hash.containsKey(key))
return (String)hash.get(key);
else {
// p1とp2を使ってString値を計算して、変数valueへ格納。
hash.put(key,value);
return value;
}
}

上記のメソッドでは、p1とp2の値のみから、変数値が計算されるのであれば、p1とp2が同じであれば、同じ返却値となります。そこで、一度でも計算した返却値をハッシュテーブルにputし、呼ばれた際には、そのキーがあれば、一度保管した返却値を返すアルゴリズムとなります。

同じようなメソッドが呼ばれるケースが多い場合には、毎回計算する必要がなくなるのでパフォーマンス向上が見込まれます。一度、使ってみてください。

0 件のコメント:

コメントを投稿