Open2
友人とのアイデア共有
以下はSpivak氏の圏論のテキストより。レモンメレンゲパイを作るためのタスクと食材同士の依存関係をまとめた図である。
複数の料理人で上記のパイを調理するとし、各員の並行および直列実行の過程と処理時間をシミュレーションしたかった。各タスクの依存関係から各員の作業として実行させる方法としてmakeコマンドが利用できた。少々改題し、食材を購入するタスクも追加して、Makefileは以下となった。
Makefile
all: lemonMeringuePieWithCard.txt
echo "done"
crust.txt:
sleep 1; touch crust.txt
lemon.txt:
sleep 1; touch lemon.txt
butter.txt:
sleep 1; touch butter.txt
sugar.txt:
sleep 1; touch sugar.txt
egg.txt:
sleep 1; touch egg.txt
yolk.txt white.txt: egg.txt
sleep 2; touch yolk.txt; touch white.txt
lemonFilling.txt: lemon.txt butter.txt sugar.txt yolk.txt
sleep 2; touch lemonFilling
lemonPie.txt: lemonFilling.txt crust.txt
sleep 2; touch lemonPie.txt
meringue.txt: sugar.txt white.txt
sleep 2; touch meringue.txt
lemonMeringuPie.txt: lemonPie.txt meringue.txt sugar.txt
sleep 1; touch lemonMeringuPie.txt
card.txt:
sleep 25; touch card.txt
lemonMeringuePieWithCard.txt: lemonMeringuPie.txt card.txt
sleep 1; touch lemonMeringuePieWithCard.txt
clean:
rm *.txt
.PHONY: clean
以下の結果となる。timeは実行時間を見るため。
$ time make -j
sleep 1; touch lemon.txt
sleep 1; touch butter.txt
sleep 1; touch sugar.txt
sleep 1; touch egg.txt
sleep 1; touch crust.txt
sleep 25; touch card.txt
sleep 2; touch yolk.txt; touch white.txt
sleep 2; touch yolk.txt; touch white.txt
sleep 2; touch lemonFilling
sleep 2; touch meringue.txt
sleep 2; touch lemonPie.txt
sleep 1; touch lemonMeringuPie.txt
sleep 1; touch lemonMeringuePieWithCard.txt
echo "done"
done
real 0m26.012s
user 0m0.038s
sys 0m0.009s
カードを購入する25secのタスクが早期に実行出来ているのは助かる。依存関係を最終要求物から遡り解決している事によるものだろう。
time make -j 3
のようにプロセスを絞るとその分実行時間が増減して面白い。2プロセスで実行するとカード購入が数秒遅れてしまい全体として少々遅くなる。この挙動は示唆に富む。以後考察を進める。
makeが依存関係をトポロジカルソート順で実行している。カード購入が後に実行されても不思議ではない。