GoCon で発表してきました

僕の発表

発表資料というかメモ

発表時間が20分だったので、ISUCONの紹介と、 Go 凄いよってことをアピールしてきました。

あとで流れてる Tweet を見ていたら、僕が一番感動した部分があまり拡散されてなかったので こちらで繰り返しておきます。

去年の ISUCON2 に参加した時、最終的にはカーネル空間で動く Webサーバー兼Memcachedサーバーの recaro を作ったのですが、それ以前に Meinheld や Go の net/http を nginx 並に速くしようと チューニングしていました。

その時に accept4 対応、 nonblock な write を分ける (当時の Go 1.0 ではシステムコールは 基本的にブロックするものとして他の goroutine を別スレッドで動かすための処理がシステムコールの たびに実行されていた)、 Date ヘッダを毎回作っていたのが遅かったので1秒間キャッシュするといった パッチを送ったのですが、取り込まれたのは accept4 だけで、 nonblock な write の最適化はスケジューラを再設計するから、 Date ヘッダについては もっと文字列操作を速くするからという理由で reject されました。

実際に Go 1.1 で両方が実装され、 Go 1.2 でさらにチューニングされて、発表時にデモしたとおり ちょっとチューニングした(access_log off; open_file_cache max=32; した) nginx よりも、 Go で 30 行ちょっとで書いた静的ファイル配信のほうが速い (もちろん条件によるでしょうが) というところまで来ました。

去年は node.js より Hello World が遅いというスレが盛り上がっていた Go が、たった1年で、 C で書かれた高速な Web サーバーの代表格である nginx と同じくらい速く、そして コードは圧倒的に読みやすい標準ライブラリの Web サーバーを持つ言語になったのです。

基調講演

Go の開発者 Andrew 氏による Go の紹介でした。

Go の特徴としてリーダビリティや、シンプルさ・一貫性とそれを基にした予測可能性という点が挙げられていました。 これはまさに僕が Python を好きな理由と同じですが、 Go は Python よりももっと高い次元でそれを実現していると思います。 直感は個人によって違うし、表現力の高さは誤解の入り込む余地を増やすので、 直感的であることや表現力の高さより、一貫性があって表現を選ぶ余地がないくらいシンプルな方が信頼できます。

その後ライブコーディングがあったのですが、並列アクセスされる struct を sync.Mutex で守るときに 埋め込みを使うとか、 Lock() したら無条件にすぐに defer Unlock() する訳じゃない (defer を使わずあとで普通に Unlockする) とか、短い時間のすごい簡単なプログラムだったのに発見がありました。

言語機能の紹介記事をいくら読んでも、それをどういった時にどう使うのかという点は身につかないので、 もっとGo開発者が書いた現実世界のコードを読む必要性を感じました。

明日また Google でコードラボというイベントがあって、まさに脱初心者のためのイベントなので とても楽しみです。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。