ISUCON6でイスコーン
前日
pixiv isuconの練習問題を、チームメイトの@chigichan24と一緒にやった。
( ・´ー・`)「適当にindex貼ってnginxで静的ファイル配って、いい感じにキャッシュすればワンチャンあるっしょw」
とか言いながらpprofのというものの存在を知り、使い方を学ぶ
dsas.blog.klab.org このページを参考に勉強(遅い
当日
朝8時に起きて急いで準備をして8時25分の電車で学校に向かう(外はどしゃぶり
バスで学校に行くのを忘れていて待ち合わせの時間に遅れる(申し訳ない
開始15分前にネットワークに接続できるようになり、5分前にチョコレートを食べる
チョコレートおいしい
開始
azureのデプロイが遅くてキレた(15分くらいかかった)
とりあえずベンチマークを走らせると、4000点くらいで、ここで終了したら勝ちじゃんと盛り上がる
まぁとりあえずgolangで動かすか、となってperlを切ってgolangを動かしてローカルで動くように諸々準備する
準備に1時間ほどかかってしまう(もったいない
ベンチマーク走らせる
Failed
( ・´ー・`)「なるほどね」
そこからボトルネックになっている部分を探すためにアクセスログを吐いたりプロファイラを走らせる
同時に、動きを見るためにコードを把握していく
mysqlのレコード数とか少なくて適当にindex貼ってもこれ無理ではとなる
実装を見て、なんだこの実装は(困惑)となりつつ読み解いていく
- dbが2つあってspamのプロセスを除くと、2つのプロセスが動いているが、ISUCONにおいてはおそらく無駄なので一緒にしてよさそう
- htmlifyの中の正規表現が重すぎる
- 毎回regexpのmatcherを作るのは頭悪そう
- スライスのcapは多めにとってよさそう
実装
htmlifyの修正を@orisanoにお願いして、isutarをisudaにマージする
htmlifyの修正の内容は、毎回keywordを取得するところを先に取得しておくようにしたり、いらないfieldの取得をやめる等
スコア 0
( ・´ー・`)「つらい」
めちゃめちゃタイムアウトしててだめっぽい
本格的にボトルネックの部分をどうにかしようととりかかる
明らかにregexpが遅すぎる
golangはregexpが遅いというのを聞いたことがあったので、そこの改善策を考える
すべてのkeywordに対してregexpしてるのがまずそうだから、一致したkeywordのエントリをテーブルに保存して次回以降はそれを参照すれば早そうということに、10分ほど考えて気づく
でも後から考えたらわざわざテーブルじゃなくて普通にキャッシュしたほうがよさそう
実装し終えてベンチに投げるが、バグがあるらしく、Failedしてた
golangのFindAllStringでハマっていて、containsで含んでいるか全部見てとりあえず解決(ここの実装は@orisanoさんがやってくれた
それ以外のも少しハマって、順位表凍結後にようやくPASS
42000
ずっとスコア0だったのでめちゃめちゃ嬉しかった
そこから正規表現で動くようにいじってもらって、ベンチ見ると10000くらいになってたのでロールバックした
あとはnginxのログ切ったりとかの最後のあがきで最終スコアは44205だった
まとめ
全体的に実装力が無くてそこに時間を取られて思いついたアイデアを実装するに至らなかった
それぞれローカルで動かす環境を整えたり、プロファイルを取り始めるのが遅くて最初の3時間のうち1時間くらい無駄だった気がする
もっと効率的にやらないとやりたいことができない
ただ、思いついたアイデアを実装して、ちゃんと効果が現れているのを見れて楽しかった
学生枠として本選に通ったので、頑張りたい