今回は前回に引き続き、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を読み進める予定です。
0 件のコメント:
コメントを投稿