C#
.NET
.NETFramework

thread作成時の実行コンテキストの伝播を抑制してみた

きっかけ

今更ながらThreadについて勉強しなおしています。
その中で、Thread作成時に、実行コンテキストの伝播を抑制することで、パフォーマンスが改善されるという情報を見つけました。

パフォーマンスが改善される

どの程度、改善されるかについては書いていなかったので、ほんとに改善されるのか実験してみました。

実行コンテキストとは

すべてのThreadが持っている情報です。
・セキュリティ設定
・ホスト設定
・コンテキストデータ
これらの情報(実行コンテキスト)は、別Threadを実行したとき、親Threadから子Threadへコピーされます。

実験

以下のコードで実行速度を計測してみました。

qiita.cs
    public class ThreadPoolPerformance
    {
        public void Main()
        {
            System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("Key", new string('A', 999999999));

            //コンテキストをコピーする
            this.ExecuteTask();

            //コンテキストのコピーを抑制する。
            System.Threading.ExecutionContext.SuppressFlow();
            this.ExecuteTask();
            System.Threading.ExecutionContext.RestoreFlow();
        }

        private void ExecuteTask()
        {
            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            watch.Start();

            System.Threading.ThreadPool.QueueUserWorkItem(callBack =>
            {
                //何かしらの処理を実行
                System.Threading.Thread.Sleep(1000);
            });

            watch.Stop();
            System.Console.WriteLine($"Elapsed:{watch.Elapsed.ToString()}");
        }
    }

結果

実行した結果以下のようになりました。

抑制なし:Elapsed:00:00:00.0007447
抑制あり:Elapsed:00:00:00.0001186

(一回の実行結果だけでは十分ではないですが)
SuppressFlowで実行コンテキストの伝播を抑制することで、実行速度が速い(パフォーマンスがよい)結果が得られました。

まとめ

実行コンテキストの伝播抑制で実行速度は速くなりました。
実験では、0.6ミリ秒ほど実行速度が改善しました。