今年のISUCONはKLabが作問するということで、ゲームが題材だと予想していた方も多かったと思います。Clickerを元にしたゲームを出題しました。これを複数人で協力プレイできるようにして、WebSocketを使っていて、クッキーではなく椅子を増やし、椅子の数が多倍長整数になる、というゲームでした。ISUCON7本選の作問でやったことを書きます。プロトタイプ作成まずプロトタイプ作成を担当しました。Clickerを元にする、という案が出ていたので、自分がやりたい要素を入れたプロトタイプを作りました。一つ目の要素は未来計算と操作遅延です。サーバが未来の値を計算できるようなデータを返し、クライアント側で各時点での値を計算するようにする、という設計です。操作を遅延させることで可能な限り同時刻での見え方が同じになるようにしました。その実態を見せる機会と考え、この要素を入れました。二つ目の要素は多倍長計算です。いう多倍長計算を使った問題を作りたいと思っていた、というのがあります。あと、メモリを消費させて、ただキャッシュするだけでは駄目なようにしたい、というのも考えていました。ここ4年ほど、この3人だけではないですが、DiamondPrincessというチームでそのICFPCに参加しています。今年は2位でした!プロトタイプの時点ではWebSocketではなく、普通のHTTP通信で、サーバはPHPで雑に書いた状態でした。ver0とver1を作ったのですが、ver0の時点ではミリ秒単位ではなく秒単位だったりしました。あと、命名が雑すぎて抽象的な一文字変数名だらけになっていたので、本実装時に名前の調整が結構大変でした。いい感じのフォントを探したりしていました。未来計算の設計時点で、ベンチマーカから見て検証可能にすることを考えていました。誤差を許容するには、許容範囲やそれに合わせた計算など、考えることが多く、それを避けた結果、厳密な検証になりました。そのため、値が1でもずれるとfailするという厳しいコンテストになりました。上限と下限を考えて検証する必要があってちょっと大変でした。初期実装作成者には苦労をかけてしまいました。負荷走行後の検証の実行時間が長すぎる問題が発生し、高速化をしました。10のn乗のキャッシュ、addingの累積和を使う、などです。(big2exp)はutil.goにあります。gamelog.goutil.goとりあえず、Go言語のbig.Intは、つらい、という感想でした。1分間のベンチマークで10の10万乗ぐらいまで到達できるようにマスタデータを調整しました。みたいなことも起きたりして申し訳ない感じだったりしました。ちなみに、Excelで値を調整して、Pythonスクリプトで雑なシミュレーションをする、ということをしていました。値を直接扱えないので、対数をとって計算していました。ご迷惑おかけしましたが、出題することができて嬉しく思っています。