【C#】async/awaitは使うだけで価値がある

  • async/awaitが書ける
  • async/awaitが非同期処理ということはわかっている
  • メリットをいまいち感じられない

という方向けの記事になります。

私自身は、WebアプリケーションをC#で作成するときに、
async/awaitを使います

しかし、使い始めた当初は効果を実感しませんでした。

というのも非同期処理というのだから、
処理が高速になるようなイメージを持っていたからです。

実際、「await」で処理は止まりますし、同期処理と処理速度
変わらないなんてこともあります。

非同期はパフォーマンスが上がることから、
「速い」と考えてしまいがちですけれども、
非同期処理は、処理を高速化させることだけに使われるわけではありません。

それ以外にも、リソースを最適化させるというメリットを持っています。

この記事でいいたいこと

  • async/awaitは単体処理の高速化ではなくリソースの最適化によってパフォーマンスを上げる

async/awaitによるリソース最適化

WEBアプリケーションでasync/awaitのメリットを感じづらいです。

  • WEBアプリケーションはそもそもアクセス単位で非同期処理している
  • async/awaitの記述で同期処理と実行速度が変わらないコードがある
  • (そもそも開発のデバッグのときに非同期をOFFにしている)

それでも、同期処理と実行速度が変わらないasync/awaitを使う意味はあります。

ざっくりいうと

「async/awaitを使うと更に多くのアクセスに対応できる」

です。

まずはasync/awaitを使用しないWEBアクセスの場合で、
リソースの消費の仕方を見てみましょう。

1つのアクセスで1つのリソースを使うイメージになります。
下記は5つのアクセスがあって5つのリソースを消費しています。

「待機中」になり待ち時間になり何もしない時間がありますね。

これは「クエリ発行」や「API通信」をするときに起きます。
アクセスを処理しているWEBサーバが他のサーバからの処理を
待っている状況です。

WEBアプリケーションは複数のリソースを使うことができますので、
待ち時間が発生したとしても同時アクセスを処理できます。

しかし、できれば空いている時間を有効活用したいですね。

そこでasync/awaitをロジックに組み込んでみましょう。

awaitを使用することは、待ち状態になることを
あらかじめプログラムで示すことになります。

そうすると実際に待ち状態になったときに、
他の処理がリソースを代わりに使い、リソースの利用の効率化ができます。

簡易的なイメージにはなりますが5つのアクセスを3リソースで捌けます。

余った2つのリソースを別の処理で使うことができるようになりますから、
async/awaitを使うと全体のパフォーマンスがあがるということです。

単体の処理では同期処理と処理速度が変わらない

async/awaitを用いると、全体の処理パフォーマンスが向上することがわかりました。

しかし、単体の処理に注目した時、同期処理と処理速度が変わらないままです。

awaitで待ち状態に入ったときに、自分が使っていないリソースを
他の処理に貸し出すだけですから、

自分の処理が止まっているということは変わらないですね。

async/awaitの使い方によっては、処理そのものを分割することで高速化もできます。それはまた別の記事にしたいと思います。

まとめ

以上が、async/awaitは単体処理の高速化ではなく、
リソースの最適化でパフォーマンスを上げるという内容になります。

async/awaitはキーワードとして関数と呼び出し箇所に足されるだけなので、
今までのロジックを変えることなく簡単に導入できます。

誰でもリソースの最適化が出来るようになるということですから、
「簡単に書ける」ということはそれだけで素晴らしいことです。

しかし、どこか難しい記述のほうがすごい機能な気がしてしまい、
「簡単に書ける」と大した機能ではないのかと感じてしまいます。

感覚的な話にはなりますが。

しかし、それでもリソースの最適化を簡単に書けるということは
WEBアプリケーションにとって大きな価値があります。

使用できる場所があれば積極的に使っていきたいですね。