Skip to content

Commit

Permalink
Add regulation document
Browse files Browse the repository at this point in the history
  • Loading branch information
Hiroshi Nakamura committed Mar 16, 2012
0 parents commit 41b04d3
Showing 1 changed file with 98 additions and 0 deletions.
98 changes: 98 additions & 0 deletions 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パラメータもいじるかもしれません。

早目にもらえれば、早目に計測結果をお渡しするようにします。

以上。

0 comments on commit 41b04d3

Please sign in to comment.