メトセラ2.0 [プログラミング - NSSetとライフゲーム]
結局、焼酎をちびちび飲みながら昨夜遅くまでメトセラにperfect hashをkeyにするCFDinctionaryを組み込んだコードのデバグしてた。とりあえずクラッシュしたりあからさまなリークが起こってたりということはなくなったので寝た。徹夜にはならなかったが夜明け前。だって一晩寝るとなにやってたか全然わからなくなるんだもん。
ところで、結果はすばらしいものだった。
これを「メトセラ2.0」としよう。Macなひとはダウンロードして試してみて欲しい。
1.0と実行効率の比較をしてみる。ベンチマークとしてXlifeに付属するパターンファイルの「gliderarmyof256.l」を使う。これはただグライダーが16行16列の256個稠密に並んでいるだけのもの。こんなの。
これを待ち時間0にして両方のバージョンで実行してみる。 こないだの、NSSetを使ってそれぞれのセルが隣のセルを保持する、というもので一世代平均15秒ほどかかった。
一方昨夜実装したperfect hashをkeyにしてCFDictionaryに保持する、というSYさんにもらったアイデアを使ったものはなんと一世代平均0.05秒ほどになった。
つまり300倍速い。こんなに違うとは思わなかった。実行環境はCore2duo2GHzメモリ2GBのiMacで他のアプリは動作していない状態。どちらのバージョンも片方のコアを使い倒しているが、これだけの差が出た。これなら他所に出しても恥ずかしくはない。
昨夜一晩で実装したので最適化はぜんぜんやってない。sharkで見てみると律速しているのは世代交代の計算ではなくてむしろ表示の方。生きたセル全部がおさまるNSImageを作ってセル座標に対応する場所に6×6ドットの丸を描いて、それを表示用のNSViewに渡している。世代交代の計算は別の作業threadでやってるけどこのNSImageを作るのはmain threadなのでせっかくthreadを分けたのにUIの応答が悪くなってしまった。NSImageを作るのを作業threadの方に移したら、この部分は行ったり来たりになって汚いコードになってしまった。暇があったらやり直そう。
例えば、グライダーが飛んでいくとNSImageのサイズがどんどん大きくなってその確保に時間がかかるようになっている。常にNSImageはサイズが違っても原点が中心になるようにしたので一方の飛んでいくグライダーのようなものを追跡すると、その反対側にも面積を確保するようになってNSImageが空白ばかりでどんどん大きくなってしまう。まあ、これはいかんともしがたい。セルのあるところだけを表示するとグライダーが移動していることなんかは表現できなくなる。それともそれがわかるようになにか背景を描かないといけない。メッシュを背景に切るかなあ。NSScrollViewとの連係が難しくなるなあ。
ということで、この状態で公開しておこう。
このMethuselah2.0.zipをダウンロードして解凍する。できたフォルダのなかには
ところで、Macにたくさんアプリを書いてきたが2.0を作ったのは初めて。個人的には画期的。
ところで、結果はすばらしいものだった。
これを「メトセラ2.0」としよう。Macなひとはダウンロードして試してみて欲しい。
1.0と実行効率の比較をしてみる。ベンチマークとしてXlifeに付属するパターンファイルの「gliderarmyof256.l」を使う。これはただグライダーが16行16列の256個稠密に並んでいるだけのもの。こんなの。
これを待ち時間0にして両方のバージョンで実行してみる。 こないだの、NSSetを使ってそれぞれのセルが隣のセルを保持する、というもので一世代平均15秒ほどかかった。
一方昨夜実装したperfect hashをkeyにしてCFDictionaryに保持する、というSYさんにもらったアイデアを使ったものはなんと一世代平均0.05秒ほどになった。
つまり300倍速い。こんなに違うとは思わなかった。実行環境はCore2duo2GHzメモリ2GBのiMacで他のアプリは動作していない状態。どちらのバージョンも片方のコアを使い倒しているが、これだけの差が出た。これなら他所に出しても恥ずかしくはない。
昨夜一晩で実装したので最適化はぜんぜんやってない。sharkで見てみると律速しているのは世代交代の計算ではなくてむしろ表示の方。生きたセル全部がおさまるNSImageを作ってセル座標に対応する場所に6×6ドットの丸を描いて、それを表示用のNSViewに渡している。世代交代の計算は別の作業threadでやってるけどこのNSImageを作るのはmain threadなのでせっかくthreadを分けたのにUIの応答が悪くなってしまった。NSImageを作るのを作業threadの方に移したら、この部分は行ったり来たりになって汚いコードになってしまった。暇があったらやり直そう。
例えば、グライダーが飛んでいくとNSImageのサイズがどんどん大きくなってその確保に時間がかかるようになっている。常にNSImageはサイズが違っても原点が中心になるようにしたので一方の飛んでいくグライダーのようなものを追跡すると、その反対側にも面積を確保するようになってNSImageが空白ばかりでどんどん大きくなってしまう。まあ、これはいかんともしがたい。セルのあるところだけを表示するとグライダーが移動していることなんかは表現できなくなる。それともそれがわかるようになにか背景を描かないといけない。メッシュを背景に切るかなあ。NSScrollViewとの連係が難しくなるなあ。
ということで、この状態で公開しておこう。
このMethuselah2.0.zipをダウンロードして解凍する。できたフォルダのなかには
- メトセラアプリ
- パターンデータ集
- ColorLists
- HowToInstall
- Manual.pdf
ところで、Macにたくさんアプリを書いてきたが2.0を作ったのは初めて。個人的には画期的。
2010-11-03 20:52
nice!(0)
コメント(2)
トラックバック(0)
セル数が増えると如実に効いてきますね、驚きです。実効テストしてもらった感じだし、マニュアルにまで載せていただいて、ありがとうございます。
by SY (2010-11-04 14:34)
僕もこの差には驚きました。もとのver.1.0のNSSetを使ったコードがヘボいのかも知れませんが、ヘボさもせいぜい一桁ぶんくらいしかないはずです。
ところで、本当のことを言うとマニュアルはいつもやる、ちゃんとしたアプリのパロディです。中身に嘘はありませんが、いかにも大袈裟なソフトだと主張するためのもので、これまでは前回のSpaghettiMazeMakerを含めて非公開の仕事用のアプリでも必ずやってきました。しかも必ず英語版も同時に作ります。
若い頃から仕事では数値計算のソフトを書いても計算の結果だけしか評価されなかったのですが、なぜかマニュアルを作ると評価が+1段上がりました(どうせ僕以外誰も使う気なんかないくせに、です)。妙に丁寧なマニュアルは、そのなごりです。
ネタに巻き込んでしまってすみません。
by decafish (2010-11-04 21:58)