Mercurial > hg > Papers > 2014 > toma-master
annotate paper/chapter4.tex @ 44:7ce8abcf0316
fix label
author | Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 04 Feb 2014 09:44:06 +0900 |
parents | aa6de0f67a0a |
children | e32c9a53310c |
rev | line source |
---|---|
34 | 1 \chapter{性能評価}\label{ch:bench} |
2 本章では、非破壊的木構造データベース Jungle がマルチコアプロセッサで性能向上を果たせるのか確認する。 | |
42 | 3 また、実用的なWebサービスが提供できるのか確認するために Web 掲示板サービスを開発し、Java との比較を行う。 |
12 | 4 |
34 | 5 \section{計測環境} |
6 マルチコアプロセッサでの性能を確認するためコア数の多いサーバを用いる。 | |
7 本研究では、学科が提供するブレードサーバを用いて、計測環境を構築する。 | |
12 | 8 ブレードサーバの仕様を表\ref{tab:server_spec}に示す。 |
9 | |
43 | 10 論理コアは、Intel のハイパースレッディング機能のことである。 |
42 | 11 ハイパースレッディングは、1つのプロセッサをあたかも2つのプロセッサであるかのように扱う技術であり、 |
12 同時に演算器などを利用することはできないため性能が2倍になるわけではないが、概ね20 \%程度クロックあたりの性能が向上すると言われている。 | |
13 | |
12 | 14 \begin{table}[!htbp] |
15 \begin{center} | |
16 \begin{tabular}{|c||c|} \hline | |
17 名前 & 概要 \\ \hline \hline | |
18 CPU & Intel(R) Xeon(R) CPU X5650@2.67GHz * 2\\ \hline | |
19 物理コア数 & 12 \\ \hline | |
20 論理コア数 & 24 \\ \hline | |
21 Memory & 126GB \\ \hline | |
22 OS & Fedora 14 \\ \hline | |
23 \end{tabular} | |
24 \end{center} | |
42 | 25 \caption{学科が提供するブレードサーバの仕様} |
44 | 26 \label{tab:server_spec} |
12 | 27 \end{table} |
28 | |
34 | 29 非破壊的木構造データベース Jungle の並列読み込みと並列書き込みの性能の計測には1台、 |
42 | 30 Web 掲示板 サービスを用いた Java との性能比較には2台のブレードサーバを利用する。 |
31 2 台使用するのは、サーバと負荷をかけるクライアントを別々に実行するためである。 | |
12 | 32 |
33 \subsubsection{Haskell および Java のバージョン} | |
34 Haskell のコンパイラには The Glasgow Haskell Compiler(GHC)を使用する。 | |
42 | 35 GHC は、Haskell で最も広く使われているコンパイラである\cite{ghc}。 |
12 | 36 ソフトウェア・トランザクショナル・メモリをサポートするなど、並列プログラミングのためのHaskellの拡張が行われている。 |
37 | |
44 | 38 Haskell および Java のバージョンを表\ref{tab:compiler}に示す。 |
12 | 39 |
35 | 40 \begin{table}[!ht] |
12 | 41 \begin{center} |
42 \begin{tabular}{|c||c|} \hline | |
43 言語 & バージョン \\ \hline \hline | |
44 Haskell & Glasgow Haskell Compiler, Version 7.6.3 \\ \hline | |
45 Java & Java(TM) SE Runtime Environment (build 1.7.0\_51-b13) \\ \hline | |
46 \end{tabular} | |
47 \end{center} | |
42 | 48 \caption{ベンチマークで利用したHaskellとJavaのバージョン} |
44 | 49 \label{tab:compiler} |
12 | 50 \end{table} |
51 | |
34 | 52 計測環境の構築方法については付録に記載する。 |
12 | 53 |
54 | |
13 | 55 \section{読み込みの性能計測} |
34 | 56 非破壊的木構造データベース Jungle を用いて、マルチコアプロセッサ上で並列に読み込みを行い、線形に性能向上ができるか調査する。 |
11 | 57 |
13 | 58 \subsubsection{計測方法} |
59 ブレードサーバ上で、Jungle で作成した木構造を並列に読み込んで性能計測を行う。 | |
60 まず、Jungle を利用して木構造を作成する。 | |
61 並列に実行する際に、読み込みに負荷がかかるように木構造はある程度の大きさとする。 | |
62 今回は木の深さが 8、ノードの数が約 80 万の大きさの木構造を使用する。 | |
11 | 63 |
13 | 64 木構造を読み込み、ノードの数を数えるタスクを 1,000 個作成し並列実行する。 |
65 非破壊的木構造は、木構造に変更を加えても他の読み込みのタスクに影響を与えない。 | |
66 そのことを確認するために、木構造は各タスクに渡す前に無作為にノードを追加する。 | |
11 | 67 |
13 | 68 \subsubsection{計測結果} |
69 非破壊的木構造データベース Jungle の読み込みの計測結果を表\ref{tab:par_read}に示す。 | |
11 | 70 |
13 | 71 CPUコア数を増やしていくと、実行時間が短くなっていることが分かる。 |
72 シングルスレッドで実行した場合と比較して、2 スレッドで 1.79 倍、12 スレッドで 10.77 倍の性能向上が見られる。 | |
73 実際の計測では、13 スレッド以上は、12スレッドより速くなることもあるが、遅くなる場合もあるなど安定しない結果となっている。 | |
11 | 74 |
75 \begin{table}[!htbp] | |
76 \begin{center} | |
77 \begin{tabular}{|c||r|} \hline | |
78 CPU数 & 実行時間 \\ \hline | |
13 | 79 1 & 59.77 s\\ \hline |
80 2 & 33.36 s\\ \hline | |
81 4 & 15.63 s\\ \hline | |
82 8 & 8.10 s\\ \hline | |
83 12 & 5.55 s\\ \hline | |
84 16 & 5.65 s\\ \hline | |
85 20 & 5.23 s\\ \hline | |
86 24 & 5.77 s\\ \hline | |
87 \end{tabular} | |
88 \end{center} | |
42 | 89 \caption{読み込みの計測結果} |
44 | 90 \label{tab:par_read} |
13 | 91 \end{table} |
92 | |
93 性能向上率のグラフを図\ref{fig:benchmark_read}に示す。 | |
94 線形に近い形で性能が向上していることが分かる。 | |
42 | 95 非破壊的木構造データベース Jungle は読み込みにおいてスケールするデータベースであることが分かる。 |
13 | 96 |
97 \begin{figure}[!htbp] | |
44 | 98 \begin{center} |
99 \includegraphics[width=90mm]{./images/read.pdf} | |
100 \end{center} | |
101 \caption{読み込みの性能向上率} | |
102 \label{fig:benchmark_read} | |
13 | 103 \end{figure} |
104 | |
105 \clearpage | |
106 \section{書き込みの性能計測} | |
34 | 107 非破壊的木構造データベース Jungle を用いて、マルチコアプロセッサ上で並列に書き込みを行い、線形に性能向上ができるか調査する。 |
13 | 108 |
109 \subsubsection{計測方法} | |
110 ブレードサーバ上で、Jungle に木構造を並列に書き込んで性能計測を行う。 | |
111 木の深さが 6、ノードの数が約 1 万の大きさの木構造を作成しJungle に登録するタスクを 1,000 個作成し、並列に実行する。 | |
112 書き込んだ木構造はノードの数が整合しているかどうか確認する。その後正確に書き込まれてるタスクの数を出力する。 | |
113 Haskell は遅延評価のため、出力などを挟むことで評価が行われるようにしなければならない。 | |
114 | |
115 \subsubsection{計測結果} | |
116 非破壊的木構造データベース Jungle の書き込みの計測結果を表\ref{tab:par_write}に示す。 | |
117 | |
118 CPUコア数を増やしていくと、実行時間が短くなっていることが分かる。 | |
119 シングルスレッドで実行した場合と比較して、2 スレッドで 1.55 倍、12 スレッドで 3.86 倍の性能向上が見られる。 | |
21 | 120 読み込みと比べ、書き込みはJungleへの登録作業があるため並列化率が下がり、性能向上率が低いことが分かる。 |
18 | 121 |
122 ハイパースレッディングは効果がなく、13 スレッド以上では実行時間が遅くなっている。 | |
13 | 123 |
124 | |
125 \begin{table}[!htbp] | |
126 \begin{center} | |
127 \begin{tabular}{|c||r|} \hline | |
128 CPU数 & 実行時間 \\ \hline | |
129 1 & 52.68 s\\ \hline | |
130 2 & 33.92 s\\ \hline | |
131 4 & 20.11 s\\ \hline | |
132 8 & 15.31 s\\ \hline | |
133 12 & 13.62 s\\ \hline | |
134 16 & 14.92 s\\ \hline | |
135 20 & 18.62 s\\ \hline | |
136 24 & 16.63 s\\ \hline | |
11 | 137 \end{tabular} |
138 \end{center} | |
42 | 139 \caption{書き込みの計測結果} |
44 | 140 \label{tab:par_write} |
11 | 141 \end{table} |
142 | |
13 | 143 性能向上率のグラフを図\ref{fig:benchmark_write}に示す。 |
43 | 144 書き込みは性能向上率が低いことが分かる。 |
13 | 145 |
146 \newpage | |
147 \begin{figure}[!htbp] | |
148 \begin{center} | |
149 \includegraphics[width=90mm]{./images/write.pdf} | |
150 \end{center} | |
44 | 151 \caption{書き込みの性能向上率} |
13 | 152 \label{fig:benchmark_write} |
153 \end{figure} | |
154 | |
42 | 155 Jungle へ木の登録する際に他のスレッドから登録があった場合、ソフトウェア・トランザクショナル・メモリが処理をやり直すため、並列度が下がっていると思われる。 |
156 また、GHC の問題も考えられる。 | |
21 | 157 GHC の IO マネージャーは、マルチスレッドでうまくスケールしないという問題があり、並列度が下がってしまう。 |
25 | 158 GHCの次期バージョンではIO マネージャーが改善され、スケールするようになる見込みである\cite{iomanager}。 |
21 | 159 |
34 | 160 非破壊的木構造データベース Jungle は、書き込みは並列化率が低くなってしまっている。 |
13 | 161 読み込みが高速なため、書き込みより読み込みが多用されるシステムに向いているといえる。 |
162 | |
163 \clearpage | |
164 | |
42 | 165 \section{Web サービスに組み込んでの性能評価} |
166 並列データベース Jungle が実用的なWeb サービスを提供できるのか調査する。 | |
167 Web掲示板サービスに組み込んで、性能測定を行った。 | |
13 | 168 |
42 | 169 \subsection{Web 掲示板サービスの実装} |
170 木構造データベース Jungle と Haskell の HTTP サーバ Warp\cite{warp} を用いて Web 掲示板サービスを開発する。 | |
171 Warp を用いたWeb サービスの構築法については付録に記載する。 | |
172 Warp は、ハイパースレッディングの効果がなくハイパースレッディング利用時に遅くなるため、12 スレッドまでの計測とする。 | |
11 | 173 |
42 | 174 Warp は並列に実行可能であり、並列に実行している Warp に対して、Jungle を繋げるだけで Jungle を並列に動かすことができる。 |
13 | 175 掲示板におけるデータベースへの書き込みは、板の作成と、板への書き込みがある。 |
176 Jungle において、板の作成は新しい木構造の作成、板への書き込みは木構造へのノードの追加で表現する。 | |
177 掲示板へ実装した機能を表\ref{tab:bbs_func}に示す。 | |
5 | 178 |
11 | 179 \begin{table}[!htbp] |
180 \begin{center} | |
13 | 181 \begin{tabular}{|c||c|} \hline |
182 関数名 & 概要 \\ \hline \hline | |
183 showBoard & 板の一覧を表示 \\ \hline | |
184 createBoard & 板の作成 \\ \hline | |
185 showBoardMessage & 板への書き込みの一覧を表示 \\ \hline | |
186 createBoardMessage & 板への書き込み \\ \hline | |
187 editMessage & 板への書き込みの編集 \\ \hline | |
11 | 188 \end{tabular} |
189 \end{center} | |
42 | 190 \caption{Web掲示板サービスへ実装した機能一覧} |
44 | 191 \label{tab:bbs_func} |
11 | 192 \end{table} |
193 | |
42 | 194 \begin{figure}[!htbp] |
195 \begin{center} | |
196 \includegraphics[width=90mm]{./images/request.pdf} | |
197 \end{center} | |
44 | 198 \caption{Warp を用いたWeb掲示板サービス} |
42 | 199 \label{fig:request} |
200 \end{figure} | |
201 | |
202 | |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
203 \subsection{読み込み} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
204 \subsubsection{計測方法} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
205 掲示板に対して読み込みを行い、負荷をかける。 |
34 | 206 掲示板を立ち上げるサーバと、性能測定ツール weighttp\cite{weighttp} を用いて負荷をかけるサーバの 2 台ブレードサーバを用いて測定を行った。 |
13 | 207 |
34 | 208 weighttpの設定は、リクエストの総数 100 万、同時に接続するコネクションの数 1,000、実行時のスレッド数 10、HTTP Keep-Alivesを有効とする。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
209 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
210 \subsubsection{計測結果} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
211 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
212 掲示板の読み込みの計測結果を表\ref{tab:bbs_read}に示す。 |
11 | 213 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
214 並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。 |
43 | 215 シングルスレッドで実行した場合と比較して、12 スレッドで 2.14 倍の性能向上が見られる。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
216 これは HTTP サーバ Warp がボトルネックとなってしまっているためだと考えられる。 |
11 | 217 |
43 | 218 Warp のボトルネックがどれぐらいあるのか調査するために、アクセスした際に "hello, world" という文字列を返すだけのプログラムを作成し測定する。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
219 結果を表\ref{tab:warp}に示す。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
220 1 スレッドで実行した場合は、Jungle と組み合わせた掲示板より速い。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
221 しかしながら、スレッド数が増えていくと掲示板の読み込みとあまり結果が変わらなくなってしまう。 |
42 | 222 Warp は現状あまり並列化効果がでていない。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
223 |
11 | 224 \begin{table}[!htbp] |
225 \begin{center} | |
226 \begin{tabular}{|c||r|} \hline | |
227 CPU数 & 実行時間 \\ \hline | |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
228 1 & 60.72 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
229 2 & 37.74 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
230 4 & 28.97 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
231 8 & 27.73 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
232 12 & 28.33 s\\ \hline |
11 | 233 \end{tabular} |
234 \end{center} | |
42 | 235 \caption{掲示板を利用した読み込みの計測結果} |
44 | 236 \label{tab:bbs_read} |
11 | 237 \end{table} |
238 | |
239 \begin{table}[!htbp] | |
240 \begin{center} | |
241 \begin{tabular}{|c||r|} \hline | |
242 CPU数 & 実行時間 \\ \hline | |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
243 1 & 49.28 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
244 2 & 35.45 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
245 4 & 25.70 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
246 8 & 27.90 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
247 12 & 29.23 s\\ \hline |
11 | 248 \end{tabular} |
249 \end{center} | |
42 | 250 \caption{Warpの計測結果} |
44 | 251 \label{tab:warp} |
11 | 252 \end{table} |
253 | |
42 | 254 Web サービスを用いて実験する場合、データベースだけがボトルネックとなるように負荷をかけるのは難しい。 |
21 | 255 ただ単にデータを大きくするだけでは、文字列をHTMLに変換するコストが大きくなってしまうためである。 |
256 | |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
257 \subsection{書き込み} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
258 \subsubsection{計測方法} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
259 掲示板に対して書き込みを行い、負荷をかける。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
260 掲示板を立ち上げるサーバと、weighttpを用いて負荷をかけるサーバの 2 台ブレードサーバを用いて測定を行った。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
261 |
42 | 262 weighttpでは、GET しかできないためURLのクエリ文字列でデータを書き込めるようにWeb掲示板サービスを変更した。 |
28 | 263 weighttp起動時のオプションは、読み込みと同じである。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
264 \subsubsection{計測結果} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
265 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
266 掲示板の書き込みの計測結果を表\ref{tab:bbs_write}に示す。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
267 並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。 |
43 | 268 シングルスレッドで実行した場合と比較して、12 スレッドで 1.65 倍の性能向上が見られる。 |
42 | 269 読み込みに比べて、書き込みのほうが全体的に遅くなっている。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
270 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
271 \begin{table}[!htbp] |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
272 \begin{center} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
273 \begin{tabular}{|c||r|} \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
274 CPU数 & 実行時間 \\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
275 1 & 54.16 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
276 2 & 36.71 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
277 4 & 31.74 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
278 8 & 31.58 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
279 10 & 32.64 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
280 12 & 32.68 s\\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
281 \end{tabular} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
282 \end{center} |
42 | 283 \caption{掲示板を利用した書き込みの計測結果} |
44 | 284 \label{tab:bbs_write} |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
285 \end{table} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
286 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
287 \subsection{Javaを用いた非破壊的木構造データベースとの比較} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
288 非破壊的木構造データベースは、Haskell 版と Java 版の2つ存在する。 |
42 | 289 Web 掲示板サービスを両方の言語で実装し、比較を行う。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
290 Haskell ではフロントエンドとして Warp を利用したが、Java では Jetty を利用する。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
291 Jetty のバージョンは 6.1.26 を用いる。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
292 |
42 | 293 Haskell 版と Java 版の Web 掲示板サービスをブレードサーバ上で実行し、 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
294 weightttpで負荷をかけ100万リクエストを処理するのにかかる時間を計測する。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
295 Haskell と Java の測定結果を表\ref{tab:compare}に示す。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
296 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
297 \begin{table}[!htbp] |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
298 \begin{center} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
299 \begin{tabular}{|c||r|r|} \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
300 測定 & Haskell & Java \\ \hline \hline |
15 | 301 読み込み & 28.33 s & 53.13 s \\ \hline |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
302 書き込み & 32.68 s & 76.4 s \\ \hline |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
303 \end{tabular} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
304 \end{center} |
42 | 305 \caption{HaskellとJavaの比較} |
44 | 306 \label{tab:compare} |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
307 \end{table} |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
308 |
43 | 309 Haskell 版は、Java 版と比較して読み込みで 1.87 倍、書き込みで 2.3 倍の性能差が出ている。 |
14
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
310 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
311 書き込みが読み込みより性能差が出ている理由として遅延評価が考えられる。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
312 Haskell では書き込みを行う際、完全に評価せず thunk として積み上げていく。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
313 thunkとは、未評価の式を追跡するのに使われるものである。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
314 遅延評価は、グラフ簡約があるため先行評価より簡約ステップ数が増えることはない。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
315 また、不要な計算が省かれるので簡約ステップ数が少なくなることもある。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
316 しかしながら、計算の所用領域が増えてしまうのが難点で、 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
317 ハードウェアが効率的に利用できるメモリの範囲内に収まらなければ即時評価より実行時間が遅くなってしまうことがあるので注意が必要である。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
318 本実験では、潤沢にメモリを割り当てているためそういった問題は起きない。 |
729ec8d5a16d
finish benchmark chapter
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
319 |
43 | 320 \subsection{書き込みごとに読み込みを行った場合} |
321 書き込みごとに毎回読み込みを挟むことで、遅延評価ではなく即時評価させる。 | |
322 計測結果を表\ref{tab:write_read}に示す。 | |
323 | |
324 \begin{table}[!htbp] | |
325 \begin{center} | |
326 \begin{tabular}{|c||r|} \hline | |
327 CPU数 & 実行時間 \\ \hline | |
328 1 & 141.40 s\\ \hline | |
329 2 & 70.87 s\\ \hline | |
330 4 & 54.32 s\\ \hline | |
331 8 & 55.13 s\\ \hline | |
332 12 & 58.60 s\\ \hline | |
333 \end{tabular} | |
334 \end{center} | |
335 \caption{書き込みを行うたびに読み込みを挟んだ場合の計測結果} | |
44 | 336 \label{tab:write_read} |
43 | 337 \end{table} |
338 | |
339 結果が明らかに遅くなっている。 | |
340 12 スレッドで実行した際、 Java との書き込みの性能差は、1.30 倍である。 | |
341 シングルスレッドで実行した場合と比較した場合、12 スレッドで 2.40 倍の性能向上が見られる。 |