changeset 43:aa6de0f67a0a

add files
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Tue, 04 Feb 2014 09:38:20 +0900
parents ff15fb78a3ae
children 7ce8abcf0316
files paper/abstract_eng.tex paper/benchmark/readwrite/readwrite.txt paper/chapter3.tex paper/chapter4.tex paper/conclusion.tex paper/introduciton.tex paper/master_paper.pdf paper/master_paper.tex slides/images/get_root_node.png slides/images/read.png slides/images/write.png slides/master.html
diffstat 12 files changed, 531 insertions(+), 201 deletions(-) [+]
line wrap: on
line diff
--- a/paper/abstract_eng.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/abstract_eng.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -3,7 +3,7 @@
 It provides a modern type system, type-safe and type inference makes it possible to write a program reliable\cite{types}.
 Haskell has referential transparency that allows the programmer and the compiler to reason about program behavior.
 
-In this study, We implement the parallel database using Haskell and non-destructive tree.
+In this study, we implement the parallel database using Haskell and non-destructive tree.
 
 We measures the performance for reading and writing of parallel database.
 We achieve to bring out the performance of the multi-core processor.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/benchmark/readwrite/readwrite.txt	Tue Feb 04 09:38:20 2014 +0900
@@ -0,0 +1,14 @@
+1 CPU
+finished in 141 sec, 406 millisec and 378 microsec, 7071 req/s, 980 kbyte/s 
+
+2CPU
+finished in 70 sec, 871 millisec and 294 microsec, 14110 req/s, 1956 kbyte/s 
+
+4 CPU
+finished in 54 sec, 326 millisec and 314 microsec, 18407 req/s, 2552 kbyte/s 
+
+8 CPU
+finished in 55 sec, 136 millisec and 70 microsec, 18136 req/s, 2515 kbyte/s
+
+12 CPU
+finished in 58 sec, 606 millisec and 103 microsec, 17063 req/s, 2366 kbyte/s 
--- a/paper/chapter3.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/chapter3.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -1,4 +1,4 @@
-\chapter{Haskellによる並列データベースの実装}\label{ch:impl}
+\chapter{Haskellによる\\並列データベースの実装}\label{ch:impl}
 本章では、並列データベース Jungle の実装について述べる。
 
 \section{木構造データベース Jungle}
--- a/paper/chapter4.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/chapter4.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -7,7 +7,7 @@
 本研究では、学科が提供するブレードサーバを用いて、計測環境を構築する。
 ブレードサーバの仕様を表\ref{tab:server_spec}に示す。
 
-論理コアは、Intel のハイパースレッディング機能のことであうr.
+論理コアは、Intel のハイパースレッディング機能のことである。
 ハイパースレッディングは、1つのプロセッサをあたかも2つのプロセッサであるかのように扱う技術であり、
 同時に演算器などを利用することはできないため性能が2倍になるわけではないが、概ね20 \%程度クロックあたりの性能が向上すると言われている。
 
@@ -35,10 +35,10 @@
 GHC は、Haskell で最も広く使われているコンパイラである\cite{ghc}。
 ソフトウェア・トランザクショナル・メモリをサポートするなど、並列プログラミングのためのHaskellの拡張が行われている。
 
-Haskell および Java のバージョンを表\ref{tab:compiler}に示す。
+Haskell および Java のバージョンを表\ref{compiler}に示す。
 
 \begin{table}[!ht]
-\label{tab:compiler}
+\label{compiler}
 \begin{center}
 \begin{tabular}{|c||c|} \hline
 言語 & バージョン \\ \hline \hline
@@ -141,7 +141,7 @@
 \end{table}
 
 性能向上率のグラフを図\ref{fig:benchmark_write}に示す。
-書き込みは並列化率が低く、性能向上が 4 倍程度で止まっている。
+書き込みは性能向上率が低いことが分かる。
 
 \newpage
 \begin{figure}[!htbp]
@@ -212,9 +212,10 @@
 掲示板の読み込みの計測結果を表\ref{tab:bbs_read}に示す。
 
 並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。
+シングルスレッドで実行した場合と比較して、12 スレッドで 2.14 倍の性能向上が見られる。
 これは HTTP サーバ Warp がボトルネックとなってしまっているためだと考えられる。
 
-Warp のボトルネックがどれぐらいあるのか調査するために、アクセスした際に "hello, world" と返すだけのプログラムを作成し測定する。
+Warp のボトルネックがどれぐらいあるのか調査するために、アクセスした際に "hello, world" という文字列を返すだけのプログラムを作成し測定する。
 結果を表\ref{tab:warp}に示す。
 1 スレッドで実行した場合は、Jungle と組み合わせた掲示板より速い。
 しかしながら、スレッド数が増えていくと掲示板の読み込みとあまり結果が変わらなくなってしまう。
@@ -264,6 +265,7 @@
 
 掲示板の書き込みの計測結果を表\ref{tab:bbs_write}に示す。
 並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。
+シングルスレッドで実行した場合と比較して、12 スレッドで 1.65 倍の性能向上が見られる。
 読み込みに比べて、書き込みのほうが全体的に遅くなっている。
 
 \begin{table}[!htbp]
@@ -304,7 +306,7 @@
 \caption{HaskellとJavaの比較}
 \end{table}
 
-Haskell 版は、Java 版と比較して読み込みで 1.87 倍、書き込みで 2.3 倍の性能が出ている。
+Haskell 版は、Java 版と比較して読み込みで 1.87 倍、書き込みで 2.3 倍の性能差が出ている。
 
 書き込みが読み込みより性能差が出ている理由として遅延評価が考えられる。
 Haskell では書き込みを行う際、完全に評価せず thunk として積み上げていく。
@@ -315,3 +317,25 @@
 ハードウェアが効率的に利用できるメモリの範囲内に収まらなければ即時評価より実行時間が遅くなってしまうことがあるので注意が必要である。
 本実験では、潤沢にメモリを割り当てているためそういった問題は起きない。
 
+\subsection{書き込みごとに読み込みを行った場合}
+書き込みごとに毎回読み込みを挟むことで、遅延評価ではなく即時評価させる。
+計測結果を表\ref{tab:write_read}に示す。
+
+\begin{table}[!htbp]
+\label{tab:write_read}
+\begin{center}
+\begin{tabular}{|c||r|} \hline
+CPU数 & 実行時間 \\ \hline
+1 & 141.40 s\\ \hline
+2 & 70.87 s\\ \hline
+4 & 54.32 s\\ \hline
+8 & 55.13 s\\ \hline
+12 & 58.60 s\\ \hline
+\end{tabular}
+\end{center}
+\caption{書き込みを行うたびに読み込みを挟んだ場合の計測結果}
+\end{table}
+
+結果が明らかに遅くなっている。
+12 スレッドで実行した際、 Java との書き込みの性能差は、1.30 倍である。
+シングルスレッドで実行した場合と比較した場合、12 スレッドで 2.40 倍の性能向上が見られる。
--- a/paper/conclusion.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/conclusion.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -8,14 +8,14 @@
 実装において、Haskellの表現力とコンパイル時に多くのエラーを捕まえるという特徴は、開発期間およびコード行数の短縮に繋がった。
 また、型安全により実行時に型エラーによってプログラムが終了するといったことがない。
 
-実装した並列データベースの読み込みと書き込みについて性能を計測し、読み込みに関して 98.96 \%という高い並列化率が確認できた。
-また、掲示板ウェブアプリケーションを開発し、既存の Java の非破壊的木構造データベースとの比較をおこない、Java のおよそ 2 倍の性能を確認することができた。
+読み込みに関して 12 コアで実行した場合、1 コアで実行した場合と比較して、10.77 倍 という性能向上率が確認でき、マルチコアプロセッサの性能を引き出すことができた。
+また、Web 掲示板サービスを開発し、 既存の Java の非破壊的木構造データベースを用いた掲示板実装との比較をおこない、読み込みで 1.87 倍、書き込みで 2.3 倍の性能が確認できた。
 
 \section{今後の課題}
 非破壊的木構造データベース Jungle の今後の課題について述べる。
 
 \subsubsection{書き込み処理の並列度の上昇}
-データベースへの書き込み処理において 80.8 \%の並列度しか出ていない。
+データベースへの書き込み処理において、12 スレッド時で 3.86 倍の性能向上しか達成できていない。
 はじめに、プログラムの変更をせずに、GHC の IO マネージャーの改善によりどの程度並列度が向上するのかを調査する必要がある。
 GHC の IO マネージャーの影響度を計測した後、変更処理の改善方法に調査する。
 現在ソフトウェア・トランザクショナル・メモリを用いているが、他のスレッドセーフな参照型を用いて性能改善が行えないか確認する。
@@ -23,12 +23,12 @@
 ロックが制限的だが、高速なIORef、ロックの使えるMVarなどである。
 
 \subsubsection{分散データベースとしての実装}
-並列環境で実行できるが、今後は分散データベースとして実行できるようにしたい。
+現在、並列環境で実行できるが、今後は分散データベースとして実行できるようにしたい。
 トポロジーの形成機能や、サーバ間でのデータアクセスの仕組みを実装する必要がある。
 サーバ間で木構造の変更を共有するには、木構造を何らかの情報に基づいて、マージする仕組みを導入する必要がある。
 
 \subsubsection{永続性の実装}
 非破壊的木構造データベース Jungle は、オンメモリ上で動作するデータベースである。
 並列性を損なわない形で、ディスクへの書き出しを実現したい。
-簡単な実装としては、書き出しを担当するスレッドを作成するといったことが考えられる。
+実装としては、書き出しを担当するスレッドを作成するといったことが考えられる。
 
--- a/paper/introduciton.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/introduciton.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -3,7 +3,7 @@
 
 Web サービスの脆弱性狙った攻撃が頻繁に発生している。
 脆弱性を悪用されると、Web サービス運営者は賠償など多大な損害を受ける可能性がある。
-純粋型プログラミング言語 Haskell は、バッファオーバーフローや、クロスサイトスクリプティング、SQL インジェクションを事前の型検査で防ぐことができる。
+純粋関数型プログラミング言語 Haskell は、バッファオーバーフローや、クロスサイトスクリプティング、SQL インジェクションを事前の型検査で防ぐことができる。
 つまり、Haskell を用いることで信頼性の高い Web サービスを開発できると言える。
 
 本研究の目標は、Haskell を用いて信頼性の高い Web サービスおよびデータベースの開発である。
Binary file paper/master_paper.pdf has changed
--- a/paper/master_paper.tex	Tue Feb 04 06:35:58 2014 +0900
+++ b/paper/master_paper.tex	Tue Feb 04 09:38:20 2014 +0900
@@ -65,7 +65,7 @@
 
 %要旨
 \input{abstract.tex}
-\input{abstract_eng.tex}
+% \input{abstract_eng.tex}
 
 %目次
 \tableofcontents
Binary file slides/images/get_root_node.png has changed
Binary file slides/images/read.png has changed
Binary file slides/images/write.png has changed
--- a/slides/master.html	Tue Feb 04 06:35:58 2014 +0900
+++ b/slides/master.html	Tue Feb 04 09:38:20 2014 +0900
@@ -53,35 +53,43 @@
           研究概要
 				</h3>
         <p>
-        Haskellは純粋関数型プログラミング言語である。
-        モダンな型システムを持ち、型推論と型安全により簡潔で信頼性の高いプログラムを書くことが可能である。
+        Haskell を用いて並列データベースを実装した。
+        </p>
+        <p>
+        読み込みに関して 12 コアで実行した場合、10.77 倍 という性能向上率が確認できた。
         </p>
         <p>
-        本研究では、Haskell を用いて並列に読み書き可能なデータベースの実装を行う。
-        並列にデータへアクセスする手法として、非破壊的木構造を用いる。
-        非破壊的木構造は、元となる木構造を書き換えることなく編集を可能にする手法である。
+        また、Web 掲示板サービスを開発し、Java より読み込みで 1.87 倍、書き込みで 2.3倍の性能が確認できた。
+        </p>
+			</article>
+			<article>
+				<h3>
+          研究背景
+				</h3>
+        <p>
+        Web サービスの脆弱性を悪用されると多大な被害がでる
         </p>
         <p>
-        実装した並列データベースの読み込みと書き込みについて性能を計測し、読み込みに関して 98.96 % という高い並列度が確認できた。
-        また、簡単な掲示板ウェブアプリケーションを開発し、既存の Java の非破壊的木構造データベースとの比較をおこない、Java のおよそ 2倍の性能を確認することができた。
+        Haskell は型検査でバッファオーバーフローや、クロスサイトスクリプティング、SQL インジェクションを防げる
+        </p>
+        <p>
+        Haskell を用いてデータベースと Web サービスの開発を行う
         </p>
 			</article>
 
 			<article>
 				<h3>
-          Haskell とは
+          Haskell
 				</h3>
         <p>
-        Haskellは純粋関数型プログラミング言語である。
-        関数とは、一つの引数を取り一つの結果を返す変換器のことである。
-        関数型プログラミング言語では、関数を引数に適用させていくことで計算を行う。
+        Haskellは純粋関数型プログラミング言語
         </p>
         <p>
-        既存の手続き型言語と異なり、手順を記述するのではなく、この関数が何であるかということを記述する。
-        例えば、Haskell でフィボナッチ数列を定義するには以下の様に記述する。
+        純粋とは、引数が同じならば関数が必ず同じ値を返す
         </p>
 
 <pre>
+fib :: Int −&gt; Int
 fib 0 = 0
 fib 1 = 1
 fib n = fib (n-2) + fib (n-1)
@@ -90,121 +98,117 @@
 
 			<article>
 				<h3>
-          Haskell の特徴
+          実行時型エラーがない
 				</h3>
         <p>
-        Haskellの他の言語との大きな違いは、純粋性を持つことと現代的な型システムを備えていることである。
+        Haskellは、評価の際に型に起因するエラーが起きない
+        </p>
+        <p>
+        [1,2,3]のリストに文字'a'を追加することはできない
         </p>
         <p>
-        純粋性を持つとは、引数が同じならば関数は必ず同じ値を返すということを保証しているという意味である。
-        関数が引数のみに依存する場合、関数はどのタイミングで実行してもよいため並列化が行いやすい。
+        コンパイル時にエラーになる
         </p>
+<pre>
+abc = 'a' : [1,2,3]
+</pre>
+
+<pre>
+-- リスト型の定義
+data [] a = [] | a : [a]
+</pre>
+			</article>
+
+			<article>
+				<h3>
+          型推論
+				</h3>
+        <p>
+        Haskell が型を推論してくれる
+        </p>
+<pre>
+getChildren node path = elems (children (getNode node path))
+</pre>
+        <p>
+        </p>
+<pre>
+*Jungle&gt; :type getChildren
+getChildren :: Node -&gt; Path -&gt; [Node]
+</pre>
 			</article>
 
 			<article>
 				<h3>
-          Haskell の型システム
+          モナド
 				</h3>
         <p>
-        Haskell では、すべての式、すべての関数に型がある。
-        Haskell の型システムはプログラマにいくつかの恩恵をもたらす。
+        文脈を保ったまま関数を繋いでいくことができる
         </p>
-        <ul>
-          <li>エラーの検出
-          <li>抽象化
-          <li>安全性
-          <li>ドキュメント化
-        </ul>
-        <p>
-        ひとつずつ説明していく
-        </p>
+<pre>
+data Maybe a = Nothing | Just a
+</pre>
+<pre>
+instance Monad Maybe where
+    return x = Just x
+    Nothing &gt;&gt;= f = Nothing
+    Just x &gt;&gt;= f  = f x
+</pre>
+<pre>
+up 4 = Nothing
+up n = Just (n + 1)
+
+down 0 = Nothing 
+down n = Just (n - 1)
+</pre>
+<pre>
+return 3 &gt;&gt;= down &gt;&gt;= down &gt;&gt;= up &gt;&gt;= up
+</pre>
 			</article>
-      
+
 			<article>
 				<h3>
-          Haskell の型システム - エラーの検出
+          モナドを使わないで同じことをする
+				</h3>
+<pre>
+return 3 &gt;&gt;= down &gt;&gt;= down &gt;&gt;= up &gt;&gt;= up
+</pre>
+<pre>
+updown :: Maybe Int
+updown = case down 3 of
+            Nothing -&gt; Nothing
+            Just place1 -&gt; case down place1 of
+                    Nothing -&gt; Nothing
+                    Just place2 -&gt; case up place2 of
+                            Nothing -&gt; Nothing
+                            Just place3 -&gt; up place3
+</pre>
+			</article>
+
+
+			<article>
+				<h3>
+          マルチコアプロセッサ
 				</h3>
         <p>
-        Haskell は静的型検査によりエラーを広範囲に検出することができる。
-        プログラムが型検査器(コンパイラ)を通れば「ちゃんと動く」傾向にある。
+        現在、CPU はマルチコア化が進んでいる。
         </p>
         <p>
-        Haskell では、データ構造を独自の型で表現することができる。
-        独自に定義した型も、コンパイラの援助を得ることができる。
+        マルチコアプロセッサで線形に性能向上をするためには、処理全体で高い並列度を保つ必要性(アムダール則)
         </p>
         <p>
-        また型検査器は保守のためのツールにもなりうる。
-        独自に定義したデータ型を変更した場合、修正が必要な箇所は型の不整合が起こるので、修正が容易である。
+        並列度が 80 % の場合、どんなにコア数を増やしても性能向上は5倍まで
         </p>
 			</article>
 
 			<article>
 				<h3>
-          Haskell の型システム - 抽象化
-				</h3>
-        <p>
-        型システムは、プログラムに抽象をもたらす。
-        抽象を導入することで、低水準の詳細を気にせずプログラミングが可能になる。
-        例えば、値の型が文字列ならば、どのように実装されているかという細かいことは気にせず、
-        その文字列が他の文字列と同じように振る舞うとみなすことができる。
-        </p>
-        <p>
-        また、Haskell では型クラスを用いて、型の振る舞いを定義できる。
-        言語の基本的な機能である、同値性の検査や数値演算を抽象化することもできる。
-        </p>
-			</article>
-
-			<article>
-				<h3>
-          Haskell の型システム - 安全性
-				</h3>
-        <p>
-        Haskell の型システムは、自らがもたらす抽象の整合性を保証する。
-        型は不変の条件であり、異なる型として認識されることはない。
-        </p>
-        <p>
-        定義したデータ型は期待通りに動くことが保証される。
-        他のデータ構造の境界を超えてきたデータが書き込まれたりするようなことは起きない。
-        </p>
-			</article>
-
-			<article>
-				<h3>
-          Haskell の型システム - ドキュメント化
+          並列データベース
 				</h3>
         <p>
-        Haskell の型はプログラムを読む際にも有用である。
-        関数の型は、その関数の振る舞いを理解するヒントになる。
-        </p>
-        <p>
-        例えばリストの先頭要素を取ってくる head という関数がある。
-        この型宣言を見れば、この関数はリストの要素のどれか1つをそのまま返すだけの関数ということが分かる。
-<pre>
-head :: [a] -&gt; a
-</pre>
+        データベースを線形に性能向上させたければ、各コアからデータに同時にアクセスできるようにし並列度を高める
         </p>
         <p>
-        型はコンパイルが実行されるたびに検査されるので、コメントに埋め込まれた記述と違って古くなることがない。
-        </p>
-			</article>
-
-			<article>
-				<h3>
-          Haskell による並列データベース
-				</h3>
-        <p>
-        現在、CPU はマルチコア化が進んでいる。
-        マルチコアプロセッサで線形に性能向上をするためには、処理全体で高い並列度を保たなければならない(アムダール則)。
-        </p>
-        <p>
-        CPU コア数に応じて、データベースを線形に性能向上させたい場合、別々の CPU コアから同時にデータベースへアクセスできればよい。
-        通常は、同一のデータへアクセスする場合、競合が発生してしまい処理性能に限界が生じる。
-        </p>
-        <p>
-        本研究では、非破壊的木構造という手法を用いて競合が発生する問題を解決する。
-        競合を発生させないためには、既にあるデータを変更しなければよい。
-        非破壊的木構造は、変更元となる木構造を変更しない。
-        そのため、別々の CPU コアから同時にアクセスが可能である。
+        非破壊的木構造という手法を使う
         </p>
 			</article>
 
@@ -213,10 +217,11 @@
           非破壊的木構造
 				</h3>
         <p>
-        非破壊的木構造は、元となる木構造を書き換えることなく編集を可能にする手法である。
-        既にあるデータを変更しないため、データの競合状態が発生せず、並列に読み書きが行える。
+        元となる木構造を書き換えずに編集できる
+        </p>
         </p>
-
+        既にあるデータを変更しないので、データの競合状態が発生しない。並列に読み書きできる
+        </p>
         <div align="center">
           <img src="images/nondestructive_tree.png" width="600px">
         </div>
@@ -227,10 +232,11 @@
           非破壊的木構造 - ルートノード
 				</h3>
         <p>
-        非破壊的木構造では、どの木構造が最新かを表す情報が重要である。
-        最新の木構造を表すノードをルートノードと呼ぶ。
+        どの木構造が最新なのかを表す情報
         </p>
-
+        <p>
+        状態を持つのはここだけで、並列度を高めるにはここの設計が重要
+        </p>
         <div align="center">
           <img src="images/rootnode.png" width="400px">
         </div>
@@ -238,16 +244,35 @@
 
 			<article>
 				<h3>
-          非破壊的木構造 - ルートノードの管理
+          データベースの設計 - 並列度を高めるために
 				</h3>
         <p>
-        ルートノードの情報はスレッド間で共有する必要がある。
-        ソフトウェア・トランザクショナル・メモリ (STM) を用いて実現する。
-        STM は、排他制御を行わずに共有データを扱うことができる。
+        できるだけルートノードに触る範囲を狭くする
+        </p>
+        <p>
+        ルートノードが必要ない時はさわらない
         </p>
         <p>
-        STM は、他のスレッドによる変更を考慮せずに共有データに対して変更を行う。
-        変更をトランザクションとしてコミットする時に以下のことがひとつだけ起こる。
+        ルートノードを更新する関数と、編集する関数を綺麗に切り分ける
+        </p>
+			</article>
+
+			<article>
+				<h3>
+          Haskell でのルートノードの管理
+				</h3>
+        <p>
+        ソフトウェア・トランザクショナル・メモリ (STM) を使う
+        </p>
+        <p>
+        STM は、排他制御を行わずに共有データを扱える
+        </p>
+        <p>
+        STM は、他のスレッドによる変更を考慮せずに共有データを変更する
+        </p>
+        <p>
+        変更をトランザクションとしてコミットする時に以下のことがひとつだけ起こる
+        </p>
         <ul>
           <li>同じデータを平行して変更したスレッドが他になければ、加えた変更が他のスレッドから見えるようになる
           <li>そうでなければ、変更を実際に実行せずに破棄し、変更の処理を再度実行する。
@@ -257,83 +282,77 @@
 
 			<article>
 				<h3>
-          非破壊的木構造データベース Jungle
+          Jungle のデータ型
 				</h3>
         <p>
-        Jungle は、複数の非破壊的木構造を扱うことのできるデータベースである。
+        Jungle は、非破壊的木構造を扱う並列データベース
+        </p>
+<pre>
+-- Jungle のデータ型
+data Jungle = Jungle (TVar (Map String Tree))
+
+-- Tree のデータ型
+data Tree = Tree (TVar Node) String
+
+-- Node のデータ型
+data Node = Node (Map Int Node) (Map String ByteString)
+</pre>
+        <p>
+        TVarがついてるのはSTMを使ってる変数
         </p>
         <p>
-        木構造の識別には、名前を利用する。
-        名前を付けて作成し、名前を用いることで参照を行う。
+        Map は連想配列
+        </p>
+			</article>
+
+			<article>
+				<h3>
+          Jungle の実装
+				</h3>
+        <p>
+        Jungle は Tree と String の連想配列を持っている(状態変数)
         </p>
-        <br>
-        <br>
+        <p>
+        Tree は、ルートノードの情報と、木の名前(ルートノードの情報は状態変数)
+        </p>
+        <p>
+        Node は、子と子の場所の連想配列と、キーと値の連想配列を持ってる。
+        </p>
+
+        <br><br>
         <div align="center">
-          <img src="images/jungle.png" width="400px">
+          <img src="images/get_root_node.png" width="500px">
         </div>
 			</article>
 
 			<article>
 				<h3>
-          Jungle - データの取得と更新
+          状態を扱う関数
 				</h3>
-        <p>
-        Jungle では、データの取得や更新のためにルートノードを扱う API がある。
-        ルートノード関連の API は IO 処理となる。
-        </p>
 <pre>
--- ルートノードの取得
-node &lt;- getRootNode jungle "your_tree_name_here"
+createJungle :: IO Jungle
+createTree :: Jungle -&gt; String -&gt; IO ()
+getRootNode :: Jungle -&gt; String -&gt; IO Node
+updateRootNode :: Jungle -&gt; String -&gt; Node -&gt; IO ()
+updateRootNodeWith :: (Node -&gt; Node) -&gt; Jungle -&gt; String -&gt; IO ()
+</pre>
+        <p>
+        すべて IO が返ってくる
+        後回しで性能計測からまとめる
+        </p>
+			</article>
 
--- ルートノードの更新
-updateRootNode jungle "your_tree_name_here" node
-
--- ノードを編集する関数を渡して、ルートノードの取得から更新までを一貫して行う
-updateRootNodeWith func jungle "your_tree_name_here"
-</pre>
-			</article>
 
 			<article>
 				<h3>
-          Jungle 内部のデータ型
+          性能計測
 				</h3>
         <p>
-        Jungle 内部で用いているデータ型を示す。
-        これらの型は、Jungle 内部の関数で使われている。
+        Jungle がマルチコアプロセッサで性能が出るのか、実用的なWebサービスが提供できるのか確認する
         </p>
         <p>
-        データ型として定義することで、データ内部の整合性が保たれ、また型検査でエラーがないか検出することができる。
-        </p>
-        <table>
-          <tr>
-            <th>型の名前</th>
-            <th>概要</th>
-          </tr>
-          <tr>
-            <td>Jungle</td>
-            <td>複数の木と名前を結びつける辞書</td>
-          </tr>
-          <tr>
-            <td>Tree</td>
-            <td>木の名前とルートノードの情報</td>
-          </tr>
-          <tr>
-            <td>Node</td>
-            <td>子と属性の2つの辞書</td>
-          </tr>
-        </table>
-			</article>
-
-			<article>
-				<h3>
-          ベンチマーク
-				</h3>
-        <p>
-        非破壊的木構造データベース Jungle の読み込みと書き込みの性能の計測を行う。
-        また、簡単な掲示板ウェブアプリケーションを作成し、Java を用いた非破壊的木構造データベースとの性能比較を行う。
-        </p>
-        <p>
-        性能の計測に用いるサーバの仕様を示す。
+        性能の計測に用いるサーバの仕様<br>
+        ハイパースレッディングで24コアまで使える
         </p>
         <table>
           <tr>
@@ -359,49 +378,322 @@
         </table>
 			</article>
 
+			<article class="smaller">
+				<h3>
+          性能計測 - 読み込みの計測結果
+				</h3>
+        <p>
+        木構造の読み込みにかかる時間を計測する
+        </p>
+        <p>
+        12 スレッドで実行時に 10.77 倍の性能向上
+        </p>
+        <p>
+        ハイパースレッディングは遅くなったりと安定しない
+        </p>
+        <table>
+          <tr>
+            <th>CPU数</th>
+            <th>実行時間</th>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>59.77 s</td>
+          </tr>
+          <tr>
+            <td>2</td>
+            <td>33.36 s</td>
+          </tr>
+          <tr>
+            <td>4</td>
+            <td>15.63 s</td>
+          </tr>
+          <tr>
+            <td>8</td>
+            <td>8.10 s</td>
+          </tr>
+          <tr>
+            <td>12</td>
+            <td>5.55 s</td>
+          </tr>
+          <tr>
+            <td>16</td>
+            <td>5.65 s</td>
+          </tr>
+          <tr>
+            <td>20</td>
+            <td>5.23 s</td>
+          </tr>
+          <tr>
+            <td>24</td>
+            <td>5.77 s</td>
+          </tr>
+        </table>
+        </p>
+			</article>
+
 			<article>
 				<h3>
-          ベンチマーク - 読み込みの計測方法
+          性能計測 - 読み込みの計測結果
+				</h3>
+        <p>
+        12 スレッドまでの性能向上率
+        </p>
+        <div align="center">
+          <img src="images/read.png" width="700px">
+        </div>
+			</article>
+
+			<article class="smaller">
+				<h3>
+          性能計測 - 書き込みの計測結果
 				</h3>
         <p>
-        木構造の読み込みにかかる時間を計測する。
+        木構造の書き込みにかかる時間を計測する
+        </p>
+        <p>
+        2 スレッドで 1.55 倍の性能向上<br>
+        12 スレッドで実行時に 3.86 倍の性能向上
         </p>
         <p>
-        Jungleを用いて約 80 万のノードを持つ木構造を作成する。
-        木構造のノードの数を数えるタスクを 1,000 個作成し、並列に実行する。
+        ハイパースレッディングは12スレッド以降遅くなっている
+        </p>
+        <table>
+          <tr>
+            <th>CPU数</th>
+            <th>実行時間</th>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>52.68 s</td>
+          </tr>
+          <tr>
+            <td>2</td>
+            <td>33.92 s</td>
+          </tr>
+          <tr>
+            <td>4</td>
+            <td>20.11 s</td>
+          </tr>
+          <tr>
+            <td>8</td>
+            <td>15.31 s</td>
+          </tr>
+          <tr>
+            <td>12</td>
+            <td>13.62 s</td>
+          </tr>
+          <tr>
+            <td>16</td>
+            <td>14.92 s</td>
+          </tr>
+          <tr>
+            <td>20</td>
+            <td>18.62 s</td>
+          </tr>
+          <tr>
+            <td>24</td>
+            <td>16.63 s</td>
+          </tr>
+        </table>
+        </p>
+			</article>
+
+			<article>
+				<h3>
+          性能計測 - 書き込みの計測結果
+				</h3>
+        <p>
+        12 スレッドまでの性能向上率
+        </p>
+        <div align="center">
+          <img src="images/write.png" width="700px">
+        </div>
+			</article>
+
+			<article>
+				<h3>
+          性能計測 - 読み込みと書き込みの考察
+				</h3>
+        <p>
+        読み込みと比べて書き込みの性能向上率が低い
         </p>
         <p>
-        非破壊的木構造は、木構造に変更を加えても他の読み込みのタスクに影響を与えない。
-        そのことを確認するために、木構造は各タスクに渡す前に無作為にノードを追加する。
+        木を登録する際、他のスレッドから登録があった場合、ソフトウェア・トランザクショナル・メモリが処理をやり直すため遅いと考えられる。
+        </p>
+        <p>
+        書き込みより読み込みが多用されるシステムに向いている。
         </p>
 			</article>
 
 			<article>
 				<h3>
-          ベンチマーク - 読み込みの計測結果
+          性能計測 - Webサービスに組み込んでの性能評価
 				</h3>
         <p>
-        木構造の読み込みにかかる時間を計測する。
+        Haskell の HTTP サーバ Warp と組み合わせて Web掲示板サービスを開発する。
+        </p>
+        <p>
+         weighttpを用いて掲示板に読み込みと書き込みで負荷をかける。リクエストの総数は100万
+        </p>
+        <p>
+        Warp は、ハイパースレッディングで明らかに遅くなるので、12コアまでの計測とする。
+        </p>
+			</article>
+
+			<article>
+				<h3>
+          性能計測 - Webサービスに組み込んでの性能評価 読み込み
+				</h3>
+        <p>
+        読み込み
+        </p>
+        <p>
+        12 スレッド時に 2.14 倍
         </p>
         <p>
-        Jungleを用いて約 80 万のノードを持つ木構造を作成する。
-        木構造のノードの数を数えるタスクを 1,000 個作成し、並列に実行する。
+        性能向上率が低い
         </p>
-        <p>
-        非破壊的木構造は、木構造に変更を加えても他の読み込みのタスクに影響を与えない。
-        そのことを確認するために、木構造は各タスクに渡す前に無作為にノードを追加する。
-        </p>
-			</article>
-			<article>
-				<h3>
-          ベンチマーク - 書き込み
-				</h3>
+        <table>
+          <tr>
+            <th>CPU数</th>
+            <th>実行時間</th>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>60.72 s</td>
+          </tr>
+          <tr>
+            <td>2</td>
+            <td>37.74 s</td>
+          </tr>
+          <tr>
+            <td>4</td>
+            <td>28.97 s</td>
+          </tr>
+          <tr>
+            <td>8</td>
+            <td>27.73 s</td>
+          </tr>
+          <tr>
+            <td>12</td>
+            <td>28.33 s</td>
+          </tr>
+        </table>
 			</article>
 
 			<article>
 				<h3>
-          ベンチマーク - Java との比較
+          性能計測 - Webサービスに組み込んでの性能評価 書き込み
+				</h3>
+        <p>
+        書き込み
+        </p>
+        <p>
+        12 スレッド時に 1.65 倍
+        </p>
+        <p>
+        読み込みよりさらに悪い
+        </p>
+        <table>
+          <tr>
+            <th>CPU数</th>
+            <th>実行時間</th>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>54.16 s</td>
+          </tr>
+          <tr>
+            <td>2</td>
+            <td>36.71 s</td>
+          </tr>
+          <tr>
+            <td>4</td>
+            <td>31.74 s</td>
+          </tr>
+          <tr>
+            <td>8</td>
+            <td>31.58 s</td>
+          </tr>
+          <tr>
+            <td>12</td>
+            <td>32.68 s</td>
+          </tr>
+        </table>
+			</article>
+
+			<article class="smaller">
+				<h3>
+          Webサービスに組み込んでの性能評価 考察
 				</h3>
+        <p>
+        Warp がボトルネックとなってしまっている。
+        Warp は現状あまり並列化効果がでていない。
+        </p>
+        <p>
+        アクセスした際に、"hello, world" という文字列を返すだけのプログラムを作成し計測する。
+        </p>
+        <p>
+        Jungle を組み込んだ時と比較して、読み込みの場合はほとんど差がない。
+        </p>
+        <table>
+          <tr>
+            <th>CPU数</th>
+            <th>実行時間</th>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>49.28 s</td>
+          </tr>
+          <tr>
+            <td>2</td>
+            <td>35.45 s</td>
+          </tr>
+          <tr>
+            <td>4</td>
+            <td>25.70 s</td>
+          </tr>
+          <tr>
+            <td>8</td>
+            <td>27.90 s</td>
+          </tr>
+          <tr>
+            <td>12</td>
+            <td>29.23 s</td>
+          </tr>
+        </table>
+			</article>
+
+			<article>
+				<h3>
+          性能計測 - Java との比較
+				</h3>
+
+        <table>
+          <tr>
+            <th>測定</th>
+            <th>Haskell</th>
+            <th>Java</th>
+          </tr>
+          <tr>
+            <td>読み込み</td>
+            <td>28.33 s</td>
+            <td>53.13 s</td>
+          </tr>
+          <tr>
+            <td>書き込み</td>
+            <td>32.68 s</td>
+            <td>76.4 s</td>
+          </tr>
+        </table>
+        <p>
+        読み込みで 1.87 倍、書き込みで 2.3 倍の性能差が出ている
+        </p>
+        <p>
+        書き込みが読み込みより性能差が出ている理由として遅延評価が考えられる。
+        Haskell では書き込みを行う際、完全に評価せず途中式を積み上げていく。
+        </p>
 			</article>
 
 			<article>