はじめに
isucon13に百万円ドリブンで出ました。
127149点で11位だったので、いい生活賞をもらえるみたいいです、ありがとうございます。
でも本当は百万円がほしいです。
百万円を手に入れるには、例のあのやばい1位のチームを超える必要があります。あのチームを超えるには人間の限界を超えないとだめです。もはや真っ当な戦略ではもう勝てません。
真っ当な戦略はもうみんな書いているし、勝つためには真っ当じゃない戦略を突き詰めたいので、今回はやった真っ当じゃない戦略を残しておきます。
ChatGPTに書いてもらう
人間は雑魚なので、もう全部ChatGPTに書いてもらうといいです。
今回も実際 getUserStatisticsHandlerの n+1問題をChatGPTに書いてもらいました。
... 中略 ...
query := `
SELECT COUNT(*) FROM users u
INNER JOIN livestreams l ON l.user_id = u.id
INNER JOIN reactions r ON r.livestream_id = l.id
WHERE u.id = ?`
... 中略 ...
のN+1を直して!って頼んだら直してくれて、そのまま貼ったら通って点数が1.5倍くらいになりました。
最強のプロンプトエンジニアになってもっと複雑なN+1も全部ChatGPTに解消してもらえれば人間の壁を超えられると思います。
Copilotに従う
今回弊チームでは ETagの仕様にミスって時間を無限に溶かしてしまいました。
具体的には
ETag: 33a64df551425fcc55e4d42a148795d9f25f89d4
と書いていて、ダブルクォーテーションが抜けていました。
これを解消する鍵はChatGPTに思えますが、ChatGPTにそのまま投げてもダブルクォーテーションが抜けていることを指摘できませんでした。
...検討の結果、Copilotに従ってコードを書いていればダブルクォーテーションがついたコードを書けていたことがわかりました。
もはや人間がコードを書くとミスるので、Copilotにひな形を作ってもらうほうがいいです。
他の嘘解法
"SELECT * FROM reservation_slots WHERE start_at >= ? AND end_at <= ? FOR UPDATE"
reserveLivestreamHandlerのこれが遅くなった時、とてもトランザクションな回に見えますが、これの遅い理由は実は範囲検索なので
// id slot start_at end_at
// ...
// 8758 | 5 | 1732399200 | 1732402800
// 8759 | 5 | 1732402800 | 1732406400
ときれいになっていることを利用して、
id := 8759 + int((req.StartAt - 1732402800) / 3600)
// ...
"SELECT slot FROM reservation_slots WHERE id = ? FOR UPDATE"
とするとSlowQueryLogから消えて点数が1.5倍くらいになりました。
こういう嘘解法を積み重ねていきましょう。
さいごに
ほかの解法は全部真っ当なやつなので省略します。
実は今回は9割くらい真っ当にやりました。
エモ力が足りない。
かなしいね。
さいごに我らがういうれお先輩の言葉を貼って結びとします。
おわり