From 41b04d37265395dce8732286449e76b7ad1f3764 Mon Sep 17 00:00:00 2001 From: Hiroshi Nakamura Date: Fri, 16 Mar 2012 11:07:38 +0900 Subject: [PATCH] Add regulation document --- Regulation.txt | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Regulation.txt diff --git a/Regulation.txt b/Regulation.txt new file mode 100644 index 0000000..f3fb143 --- /dev/null +++ b/Regulation.txt @@ -0,0 +1,98 @@ +コーディングテーマ: 赤黒木ベンチマーク + +Groovy、Scala、JRubyの各言語で以下のベンチマーク値を取得し、比較する。 + +1) RBTreeMapクラスの実装 + +・RBTreeMapクラスは最低限以下の4つのAPIを実装する。 + ・RBTreeMap.newInstance() => RBTreeMap + 新たにRBTreeMapクラスのインスタンスを生成する。 + + ・RBTreeMap#put(String key, String value) => String + keyに対してvalueを結びつける。keyがnullの場合例外。valueはnull許可。 + 既にkeyに別の値が割り当てられていた場合、valueで置き換える。keyの同 + 値性の意味はJavaのStringのものに従う。戻り値は、メソッド実行前にkey + に対して割り当てられていた値。以前の値がnullだったらnull。 + ただしkeyには順序性を期待できるものとする。順序性の意味はJavaの + Stringのものに従う。 + + ・RBTreeMap#get(String key) => String + keyに対して割り当てられている値を返す。keyがnullの場合例外。値が割り + 当てられていない場合はnullを返す。 + + ・RBTreeMap#height() => int + 内部の赤黒木の最大の高さを返す。高さは、生成直後で要素数0の時に0、 + 後は、内部の赤黒木の全ての枝で黒ノードの数を数えた際の、最大の数。 + +・引数および戻り値の型については、各言語における上記相当の型を扱えればよ + く、型をString相当に制限する必要はない。ただしkeyには、JavaのStringと + 同じ意味の順序性が求められることに注意。また、height()の戻り値も、リテ + ラル数値と同値性を比較できる型であれば、intでなくなんでもよい。 + +・引数および戻り値のnullは、各言語のnull相当の値で構わない。 + +・RBTreeMapが格納できる要素数に上限があってもよい。ただしベンチマークの + ため、2**25個は格納できること。(2**25とか適当に書きましたが、繰り返し + ベンチマークを取り易い程度の個数に抑える予定です) + +・RBTreeMapクラスのAPIに対してマルチスレッドからアクセスされた場合の挙動 + は未定義。何が起こってもよい。ケアしなくてよい。してもよい。 + + +2) 動作確認 + +・RBTreeMap.newInstance()を呼び、RBTreeMapをインスタンス化する。 +・用意されたファイルを開き、全てを読み終わるまで以下を繰り返す。 + ・ファイルから1行読み込み、key、value、height文字列を取り出す。 + ・RBTreeMap#put(key, value)を呼び、戻り値がnullであることを確認する。 + ・RBTreeMap#height()を呼び、数値としてheightと一致することを確認する。 +・ファイルを閉じる。 +・再度同じファイルを開き、全てを読み終わるまで以下を繰り返す。 + ・ファイルから1行読み込み、key、value文字列を取り出す。 + ・RBTreeMap#get(key)を呼び、valueと一致することを確認する。 + ・RBTreeMap#put(key, value)を呼び、戻り値がvalueであることを確認する。 +・ファイルを閉じる。 + +用意するファイルフォーマットは、改行"\n"、区切り","、エスケープなしの簡 +易CSVフォーマット。文字列にはUS-ASCIIの範囲の文字しか入っていないものと +します。このファイルは適当に私がサンプルを用意して、事前にお渡しします。 + +---- +key,value,0[\n] +key2,value2,1[\n] +... +keyn,valuen,15[\n][EOF] +---- + + +3) ベンチマーク + +以下のベンチマークを行う前提とする。 + +・RBTreeMap.newInstance()を呼び、RBTreeMapをインスタンス化する。 +・用意されたファイルを開き、全てを読み終わるまで以下を繰り返す。 + ・ファイルから1行読み込み、key、value文字列を取り出す。 + ・RBTreeMap#put(key, value)を呼ぶ。 +・ファイルを閉じる。 +・再度同じファイルを開き、全てを読み終わるまで以下を繰り返す。 + ・ファイルから1行読み込み、key、value文字列を取り出す。 + ・RBTreeMap#get(key)を呼び、valueと一致することを確認する。 +・ファイルを閉じる。 + +上記の処理全体にかかる時間を計測しつつ、5回繰り返して実行し、ベスト値と +ワースト値を除いた3回の処理時間の平均を、各言語のベンチマーク値とする。 + +入力するファイルは、動作確認用のものと同じ。 + + +4) ベンチマークの実施 + +各言語のソースコード、実行方法(パラメータ指定方法、専用オプション、言語 +のバージョン、専用ブランチのビルド方法など?)を教えてもらい、私が同一マ +シンで実行した結果を用意します。当日用のグラフも適当に作ります。 + +GCが結果に影響するようであれば、適当にGCパラメータもいじるかもしれません。 + +早目にもらえれば、早目に計測結果をお渡しするようにします。 + +以上。