Open2

友人とのアイデア共有

bunnyhopper_isolatedbunnyhopper_isolated

以下は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プロセスで実行するとカード購入が数秒遅れてしまい全体として少々遅くなる。この挙動は示唆に富む。以後考察を進める。

bunnyhopper_isolatedbunnyhopper_isolated

makeが依存関係をトポロジカルソート順で実行している。カード購入が後に実行されても不思議ではない。