LoginSignup
27
35

More than 5 years have passed since last update.

C#のプログラムが遅いときにもしかしたら高速化するかもしれないたった1行のおまじない [STAThread]

Last updated at Posted at 2017-05-22
Program.cs
namespace ComClientTest
{
    class Program
        static void Main(string[] args)
        {
            // COMを使った処理
        }
    }
}

何の変哲もないコンソールアプリケーションですが、
COMを呼び出している場合、1行のおまじないで劇的にパフォーマンスが改善することがあります。

Program.cs
namespace ComClientTest
{
    class Program
        [STAThread]
        static void Main(string[] args)
        {
            // COMを使った処理
        }
    }
}

エントリポイント(この場合Main)に[STAThread]属性を付与するだけです。
あるプログラムではこれだけで速度が20倍になりました。

STAはシングルスレッドアパートメントの略で、そのほかにマルチスレッドアパートメント、中立スレッドアパートメント2つがあります。

STAを前提として実装されているCOMコンポーネントをMTAで呼び出すと余計なオーバーヘッドがかかって遅くなるらしい。
そして、C#では属性をなにもつけていないデフォルトの状態ではMTAになっているようです。

VB.NETではデフォルトがSTAであるため明示的にここを指定する必要はありません。ですので、全く同じコードを書いたのにVB.NETだと速い! というような現象が起こりえます。

VB.NETとC#との言語の違いは.NETではILという中間言語にコンパイルされる段階で吸収されるはず。だから同じロジックなら同じように動くはず。
と高を括っていると、思わぬ罠にハマることもあるという教訓でした。

STA、MTAなどの技術的な説明はWikipediaなどにしっかりと書かれていますが、詳細はわからなくてもおまじないとしてとりあえず追加しておく、というくらいの考え方でもよいかと思います。

ただし、COMを使っていないプログラムではなんの効果もないと思います(未検証)。

27
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
35