ISUCONにてGoの正規表現で爆死 #ISUCON #golang

概要

基本的には表題の通りです。惨敗。

http://isucon.net/に参加してました。
メンツは去年と同じく自分、@ayumu83s@roro0000
チーム名は「瞬殺の美学」集まったときにみてたナショジオが由来。瞬殺どころか
問題にじわじわなぶり殺しだったわ。
選択した言語はGo。
なるべく一週間に一回、「ざつもく会」と称して復習をしてました。
去年は初参加で準備もそんなにできなかったため、自分は無能感を否めない感じでした。
今年は今無職なうでど暇(いや、面接なんかはしてましたけど)なのでサーバーサイドでのGoを色々キャッチアップする猶予があり、やってやるぞ!という気でいました。(仕事のご相談があればご連絡くださいてへぺろ)

問題について

 一応説明しておくと、http://anond.hatelabo.jp/のようなサービスをいい感じにスピードアップしろ。という問題が出題されてました。Go言語を選択した我々は

reg.ReplaceAllStringFunc(content, func(kw string) string {})

特定のキーワード(そこそこたくさんある)を文章内に見つけたらそれをリンクつけた形に変換する。をどうやって改善するかに失敗し、failした形になります。

当日の流れ

時間は曖昧です。

9:30くらいに集合

  • 朝、くっそ眠いけど自分は家だったので比較的気楽、@ayumu83s @roro0000はおつかれさまです。
  • HOOOOOO!!!!とか言いながら無理やりテンション上げてました。

10:00

  • 開始、順調にインスタンス立てる。@roro0000の下準備が光る。
  • $GOROOT、$GOPATHでガッチャガッチャする。今時$GOROOT???と自分も混乱する。
  • @ayumu83sが$PATHを書き換えて無事死亡。戦犯ポイントを稼ぐ
  • @ayumu83sがリアルな方の仕事に巻き込まれる。土曜デプロイ乙

12:00

  • 毎回regexpのやつ生成してるのあからさまにだめじゃね?
  • キーワードとハッシュのリストもとりあえず持っとくか
とか、毎回やる必要のない作業をinitに持っていく作業をする。
反省点としてはここが大きい。この時点でもっと細かく計測作業をするべきだった。
推測するな 計測せよ

13:00

ココらへんでお昼を食べたりしながら、「一回細かく速度を取ってみてどういうデータが入ったときどこが遅くなるの?」をやろうと相談。

@ayumu83sがisudaとisuterの統合作業、UNIXドメインソケット、グローバル化した変数に追加処理等の実装をごりごり入れる。

15:00

「ビスマルク級戦艦」だったかなにかの説明がめっちゃ長くて、これを処理するのに10秒程かかってる。ということが判明。ハッシュをリンクタグに変換する工程は早かったので
どちらにしても正規表現のところをどうにかしないとアカン。

@roro0000氏が「。とか改行コード」みたいなのでパラレルに処理できないっすか?というのでそのコードを書き始める。こんなのー>https://play.golang.org/p/TeFPJ325Pu

17:00

この辺から、やはりGoの正規表現は絶望的に遅いのでどうにかしなければ
という風潮になった記憶。

strings.contains & strings.replaceに切り替えて
0だったスコアが280点とかになる。しかし、Fail。うーんマジカ。。。。。

ちなみにこの処理だとハッシュに変換したもののなかの数字をもう一回ハッシュにして死ぬ。という罠が出てきます。

17:50

strings.replacerだったのでは?ということに気づく。
  • あー、見てた!見てたのに
  • 正規表現遅いってのは知ってたのになぜ目をそらした
  • 辛い
  • もういい、とりあえずこの処理にしてページ/ が早くなるかだけ見るぞ

18:20

ページ/が早くなったのをみて無事死亡

感想

観測
遅いものは遅い、Goの正規表現
正確な知識

正確には観測の単位が大きすぎたなーと。
関数内のどの処理にどのデータが入ったときにだめなの?まで追っていれば正規表現をどうする?にもっと早く至れたのかなと。

あと、正規表現は重い。というのは知っていたのにそこから目をそらし続けていたかなと思ってます。(適切な処理を思いつかなかったというのもありますが)

正確な知識。けっこう限られた時間で作業をしていたのに「これでいいと思うんだけど、あれ?どうだったかな?」となってググったり、確認する。という作業で時間を取られちゃいました。いや、そこはこうだよ。とか断言できる断言力が足りないなと感じました。
(上の正規表現もそうですね。遅いと思ってたけど、遅いから変えないとダメだ!と)

去年よりは自分は戦えた(ポイントアップに貢献できた)と思っていますが、いかんせん
スコアがPASSしなかったし、予選突破のボーダーラインにも絡めなかったので勉強不足でですね。次回開催があればリベンジしたい。

主催、協賛の方々、ありがとうございました。
@ayumu83s@roro0000次こそ予選突破しましょう。

このブログの人気の投稿

GoとDockerのお勉強 #golang #docker

[Unity]「落ちたら消えるオブジェクト」の作り方

Firebase と Androidで認証、ストレージ、データベース #firebase