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