【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アプリケーションにとって大きな価値があります。
使用できる場所があれば積極的に使っていきたいですね。