2014年11月9日日曜日

Golang Cafe #53を開催しました。

Golang Cafe #53を開催しました。

今回は前回に引き続き、isucon4の予選問題に挑戦しました。Golang Cafeということで、GoのWebアプリケーションを置き換えたりしながら速度アップを図っていきました。

最初の状態のスコアは以下のようになりました。

$ ./benchmarker b
18:12:29 type:info message:!!! DEBUG MODE !!! DEBUGE MODE !!!
18:12:29 type:info message:launch benchmarker
18:12:29 type:warning message:Result not sent to server because API key is not set
18:12:29 type:info message:init environment
18:12:34 type:info message:run benchmark workload: 1
18:13:34 type:info message:finish benchmark workload: 1
18:13:39 type:info message:check banned ips and locked users report
18:14:04 type:report count:banned ips value:4
18:14:04 type:report count:locked users value:2568
18:14:04 type:info message:Result not sent to server because API key is not set
18:14:04 type:score success:6620 fail:0 score:1430

successがリクエストをして正しい結果が返ってきた回数で、failが間違った結果が返ってきた回数です。実際には最後のScoreの値で競っていくようです。

このisuconのアプリケーションはmartiniが使われていたので、gorillaに書き換えてみました。

$ ./benchmarker b
22:40:23 type:info message:!!! DEBUG MODE !!! DEBUGE MODE !!!
22:40:23 type:info message:launch benchmarker
22:40:23 type:warning message:Result not sent to server because API key is not set
22:40:23 type:info message:init environment
22:40:29 type:info message:run benchmark workload: 1
22:41:29 type:info message:finish benchmark workload: 1
22:41:34 type:info message:check banned ips and locked users report
22:41:59 type:report count:banned ips value:4
22:41:59 type:report count:locked users value:2569
22:41:59 type:info message:Result not sent to server because API key is not set
22:41:59 type:score success:6760 fail:0 score:1461

Golang Cafeの最中では、エラーが取れなかったのですが、その後すぐに原因が分かったのでエラーを修正した結果です。Scoreが31上がりました。やっぱりreflectionを使うとスピードがどうしても遅くなるようです。

次に、Golang Cafe #50の時に教えてもらった、gojiに書き換えてみました。

$ ./benchmarker b
23:18:46 type:info message:!!! DEBUG MODE !!! DEBUGE MODE !!!
23:18:46 type:info message:launch benchmarker
23:18:46 type:warning message:Result not sent to server because API key is not set
23:18:46 type:info message:init environment
23:18:53 type:info message:run benchmark workload: 1
23:19:53 type:info message:finish benchmark workload: 1
23:19:58 type:info message:check banned ips and locked users report
23:20:23 type:report count:banned ips value:6
23:20:23 type:report count:locked users value:2567
23:20:23 type:info message:Result not sent to server because API key is not set
23:20:23 type:score success:6920 fail:0 score:1495

更に、スコアが34上がりました。gojiは軽量フレームワークなので処理スピードが早いようです。

ここまでのソースコードはgithubにpushしてありますので興味があればどうぞ。
ソースコードをそれぞれで修正したかったので、branchを分けています。
masterは何もしていない状態なので修正後のものが見たい時は、branchを切り替えて下さい。

Goのフレームワークを変えるだけでもかなり差が出ることがわかりましたが、Sessionの保存にgorilla/sessionを使っているので、データがCookieに全て保存されて通信されてしまっているのでその辺りも修正すればもう少しスピードアップが見込めそうな気がしています。(ローカルでのテストなので通信コストは低いけど…)

次回は、リリース間近のGo1.4のRelease Noteを読み進める予定です。