###### tags: `c#` # ローカル関数・ラムダ式ローカル関数・Funcの速度比較、クロージャや静的ローカル変数の比較も デリゲート(匿名関数)はヒープに確保(クラスを生成して使いまわす)される、クロージャの場合はその都度確保されるっていうのは周知の事実だが、どのくらい速度に影響を及ぼすのかについてめっちゃ雑に調べたものです。 ## 検証コード ```csharp= private void LocalMethod_Normal() { float a = 15; for (int i = 0; i < fa1.Length; i++) { var result = Test(fa1[i],a); } bool Test(float x,float a) { return a + x < 500; } } private void LocalMethod_NormalLamda() { float a = 15; for (int i = 0; i < fa1.Length; i++) { var result = Test(fa1[i], a); } bool Test(float x, float a) => a + x < 500; } private void LocalMethod_ClosureLamda() { float a = 15; for (int i = 0; i < fa1.Length; i++) { var result = Test(fa1[i]); } bool Test(float x) => a + x < 500; } private void LocalMethod_Static() { float a = 15; for (int i = 0; i < fa1.Length; i++) { var result = Test(fa1[i], a); } static bool Test(float x, float a) { return a + x < 500; } } private void LocalMethod_Closure() { float a = 15; for (int i = 0; i < fa1.Length; i++) { var result = Test(fa1[i]); } bool Test(float x) { return a + x < 500; } } private void Func_Normal() { float a = 15; Func<float,float, bool> test = (x,a) => { return x + a < 500; }; for (int i = 0; i < fa1.Length; i++) { var result = test(fa1[i],a); } } private void Func_Closure() { float a = 15; Func<float, bool> test = x => { return x + a < 500; }; for (int i = 0; i < fa1.Length; i++) { var result = test(fa1[i]); } } ``` ## 結果 ![](https://i.imgur.com/VpwM8cg.png) * ローカル関数はクロージャ関係ない * ローカル関数はラムダ式を使用しても問題ない * Funcはローカル関数より遅い(インスタンス生成コストがかかる) * Funcはクロージャするともっと遅い * 結果には乗っけていないが場合によっては変わらない場合がある