グラニがC#にこだわる理由

第1回 神獄のヴァルハラゲートの裏側をCTOが語り尽くす!

この記事を読むのに必要な時間:およそ 3 分

C#の非同期構文をフル活用し業界最速の応答速度を実現

現在,多くのソーシャルゲームがPHPやPython,Rubyといった,いわゆるLightweight Languageを使って開発されていますが,(株)グラニではプログラミング言語としてC#を採用し,Windows環境で開発および運用を行っています。実は,現在提供している「神獄のヴァルハラゲート」は,2013年1月のリリース時点ではPHPを利用していました。しかし同年4月にC#への移植を開始し,3ヵ月後の7月16日にはC#への切り替えを完了させています。

このようにC#にこだわっている理由の一つがパフォーマンスです。ソーシャルゲームはユーザがアクションを起こすたびにデータが更新されるというしくみ上,どうしてもViewのキャッシュを効かせられなかったり,1万リクエスト/秒を超えるような高負荷が発生したりしますが,そうした状況においても平均100ミリ秒以下の応答速度を実現できるように注意しています。ユーザの体感はWebブラウザのレンダリング時間だけでなく,サーバが応答を返す際の最初の応答(Time To First Byte)も重要で,わずか50ミリ秒の差が体感速度に影響を与えます。私たちが調査する限り,神獄のヴァルハラゲートの応答速度は,業界最速と言ってもよいほど高速です。

その理由は,C#自体のパフォーマンスの高さに加えて,C# 5.0から搭載された非同期構文にあります。これを利用すれば,非同期処理ができる個所は片っ端から非同期にして一気に待つという処理が簡単に書けるため,アプリケーション全体で採用してレスポンスタイムの短縮化を図っています。たとえば,幅広い用途で利用しているKVSであるRedisへのアクセスについて,すべて非同期化し,自動でパイプライン化しています図1,リスト1)。

図1 Glimpseというツールを用いて,データベースやRedisへのアクセスを常にすべて視覚化している。タイムライン上で重なっているところは,並列にアクセスしている部分

図1 Glimpseというツールを用いて,データベースやRedisへのアクセスを常にすべて視覚化している。タイムライン上で重なっているところは,並列にアクセスしている部分

リスト1 C#による非同期プログラミングの一例。asyncとawaitを利用すれば,容易に非同期メソッドを作成できる

var frontHPs = await field.OwnGuild.Members
    .Where(x => x.Position == Position.Front)
    .Select(async x => new
    {
        Name = await x.Name,
        CurrentHP = (await x.UserStatus).CurrentHP
    })
    .WhenAll();

Lightweight LanguageとC#の本当の違い

Webアプリケーション開発において,C#を利用することがピンと来ないというエンジニアの方も多いでしょう。しかし世界では,多くのWebアプリケーションがC#で実装されています。たとえば世界最大級のプログラミング系FAQサイトであるStackoverflowは,Windows ServerとC#の組み合わせで開発されました。

たしかに現状では,Webアプリケーションの開発はLightweight Languageで行われるのが主流であり,その理由も理解しています。特にWeb業界はリリースサイクルが極めて短いため,言語としての軽量さは大きな武器になります。

さて,Lightweight Languageの軽量さとは,実際のところ何を指すのでしょうか? これは,コードの作成や修正が容易であることとされています。一方,比較されるJavaやC#はそれが容易ではなく,重量級の言語であるというわけです。それは本当でしょうか。

私たちはC#こそが軽量なプログラミング言語であると考えています。なぜなら,プログラミング言語はそれ単体で評価するものではないからです。実際に開発する際に必要となる「プログラミング言語+IDE+ライブラリ/フレームワーク」を三位一体で評価するべきでしょう。その点において,「C#+Visual Studio+.NET Framework」の組み合わせほど高いレベルですべてを提供できているプログラミング言語はほかにありません。

たしかにC#単体の軽さはLightweight Languageにかなわないかもしれません。しかし,Visual Studioというロケットブースターが付いたとき,その軽さはほかのプログラミング言語を圧倒します。

C#のIDEサポートはあらゆるプログラミング言語の中で最高レベルですが,それは言語設計自体がVisual Studioの存在を前提にしているためです。ほかのプログラミング言語のIDEがどれだけ進化しても,構文レベルでIDEを意識しているC#を追い抜くことは絶対にないでしょう。

さらにC#は進化し続けています。2008年にC# 3.0となり,2010年はC# 4.0,そして2012年にはC# 5.0と,着実にバージョンアップを重ねてきました。2014年も新しい機能が発表されようとしています。10年前と現在でプログラミング環境に求められるものは大きく変わっており,それに追随してC#は進化しているのです。

また,そもそもプログラミング言語は,ただ書けて動けばよいというものではありません。より軽量に,より高速に,そしてソースを書くことがより楽しくなっていくべきです。C#は進化し続けることで,こうした要求に応え続けています。

もちろん,ひたすら機能を追加して複雑怪奇なプログラミング言語になっては本末転倒です。その意味で,C#の言語設計者であるAnders Hejlsbergは驚異的なバランス感覚を持っていると感じています。けっして進化を止めない一方,C#にそぐわない機能は採り入れない頑固さもあります。そしていざ新しい発想を採り入れるとなれば,誰でも使いやすいように徹底的に洗練した形で実装しています。

著者プロフィール

河合宜文(かわいよしふみ)

株式会社グラニ取締役CTO。Microsoft MVP for Visual C#。特にLINQがひじょーに好き。

Twtter:@neuecc
Blog:http://neue.cc/

コメント

コメントの記入