銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

ISUCON9の参考実装をC# (ASP.NET Core 3.1)に書き換えてみた

ISUCONは説明不要の一大イベントだと思います。簡単にいうと、お題に従いより高速なWebアプリケーションを構築するコンテストです。昨年行われたISUCON9の本戦問題についてはこちらに記事があります。

isucon.net

さて、このISUCON9、参加者は予め用意されている参考実装を使うことができます。これを元に書き換えることもできますし、参考に留めて自分で一から書くこともできます。

github.com

参考実装はいくつかの言語で実装されています。Go, Perl, Python, Ruby, PHP。そう、C#がないのです。ASP.NET Coreも3.1になりましたし、必要な機能も揃ってるだろうと思い、C#に書き直してみました。

github.com

動作確認はMacで行っています。ちなみにベンチマーカーを完走させるのに必要なインデックスを貼っただけの状態での初期スコアは 約2200点です。

f:id:tanaka733:20200306195458p:plain

なお、書き直しにあたっては、ASP.NET Core 3.1 Web APIを採用し、データベースアクセスにはDapperを使っています。主にGo言語の参考実装を参考にしましたが、テストケースを回したわけではないので実装ミスがきっとあると思われます。ステータスコードやレスポンス形式は完全に同一になるように実装した(つもり)です。Go言語版の参考実装では極力1ファイルにまとめているようでしたが、流石にASP.NET Coreで1ファイルに全てのクラスをまとめてるのはあまり見かけないので、クラスをファイルごとに分けています。また、.NET Coreのコンテナ開発ではあまりやらないと思いますが、ホスト側のコード変更が即コンテナ側に反映されるようにホストパスをマウントしdotent watchでアプリを起動しています。

さて、この書き直しにあたってASP.NET Coreのいろいろな機能を活用したのですが*1、これについて4/3開催予定のC# Tokyoのオンラインmeetupで話す予定です。興味のある方はぜひこちらからご参加ください。

csharp-tokyo.connpass.com

*1:最近公開しているASP.NET Coreの記事はこれ関連だったりする