マルチスレッドにするとソフトは速くなるのか?
最近ハイパースレッディングやマルチコアのCPUが出てきて、ソフト開発において「マルチスレッド」が話題になることが増えていますが、その一方で「マルチスレッド」に対する誤解も広がっているようです。その誤解とは、「マルチスレッド化=ソフトの高速化」という誤解です。
さて、この誤解について、良くまとまった記事を以下に2本紹介しておきます。2本とも.NETに関連する記事ですが、.NET以外の環境でも同じことが言えます。
■「.NETマルチスレッド・プログラミング入門」(@IT:高木健一氏)より
マルチスレッド化で速度向上が期待できる場面は限られている
マルチスレッド化によってアプリケーションを高速化できるとよくいわれているが、解説してきたように、実は高速化できる場面もその効果も限られていることが分かっていただけただろう。
レスポンス・タイムの向上は、最も効果が大きいマルチスレッドによる高速化である。ユーザー・インターフェイスがフリーズする場面や、サーバ的な動作により複数のクライアントからのリクエストに応えなくてはならない場合には、ほぼ慣用的に用いられる。注意しなくてはならないのは、レスポンス・タイムの向上の場合、高速化というのは、あくまでユーザーから見た反応についてであり、実際に処理をすべて完了するまでの時間、つまりスループットは良くならないということである。マルチスレッド化のオーバーヘッドにより、スループットはむしろ悪化する。
スループットの向上が期待できる場面は、さらに限定的である。マルチプロセッサ環境であれば確かにその向上が期待できるが、Windowsでは、よほど高級なサーバ・マシン以外ではシングルCPUであることが普通で、利用できる環境は限られてくる。遅いデバイスに対するI/Oの待ち時間の利用も、使用できる場面は限られてくるであろう。
■「プログラミング C#/15.5 | スレッド操作指針」(Microsoft:MSDN)より
スレッドを使用すべきでないシナリオ
スレッドを初めて使用できるようになったプログラマは、すべてのアプリケーション内でスレッドを使用しようとします。これは、はっきり言ってよくある間違いです。スレッドを使用すると、それに関係する問題も発生します。すべてのプログラミング手段にいえることですが、必要なときにのみスレッドを使用するべきなのです。次のような場面では、複数スレッドの使用を可能な限り避けた方がよいでしょう。
・ 大きすぎるコスト
「15.4 スレッドの安全性と同期」で述べたように、マルチスレッドアプリケーションの設計コストは高くなります。スレッドの安全性を確保できたとしても、効果がなければ意味がありません。開発時間と設計コストを考慮し、複数のスレッドを使用するかどうかを決定すべきです。
・ 不確かなメリット
マルチスレッドアプリケーションを開発した経験がない方は驚くかもしれませんが、スレッド作成とスケジューリングには膨大な CPU オーバーヘッドがかかります。このため、結果として、シングルスレッドアプリケーションの方が高速に動作するようなこともあるのです。すべては処理内容であり、それぞれに独立した処理をスレッドとして分割しているかにかかっています。たとえば、3 個のファイルをハードディスクから読み出すとしましょう。この場合、3 個のファイルの読み出し処理それぞれに、合計 3 個のスレッドを作成してもメリットはまったくありません。理由は簡単です。個々のスレッドは、同一のハードディスクを使用することになるからです。このため、アプリケーションを作成する場合には、シングルスレッドとマルチスレッドの両バージョンを用意し、動作を評価することが大切です。きちんと評価をしたうえで、作業を開始するようにするのです。このような姿勢で臨めば、時間も設計コストも無駄になることはありません。稼動した後で、パフォーマンスの低さを指摘されるようなこともありません。
これらの記事にあるように、「マルチスレッド」の効果はケースによって違い、またマルチスレッド処理自体にも相当CPUコストがかかるため、必ずしも作動速度の向上が期待できるというわけではありません。