2016-10-09 7 views
0

私はプログラムのパフォーマンス重視のセクションで良い最適化を達成しようとしています。静的メソッド内の新しいキーワードについての混乱

newキーワードのためCountAbcdef()を呼び出すたびにchar[] abcdefが再作成されるのはなぜですか?私はそれを外側に移動させてという静的なとして宣言する必要がありますか?あなたは右の配列がCountAbcdefこのよう呼び出されるたびに初期化されますことにある

private static int CountAbcdef(string s) 
{ 
    var abcdef = new[] { 'a', 'b', 'c', 'd', 'e', 'f' }; 
    return s.Count(abcdef.Contains); 
} 

おかげ

+2

はい、CountAbcdefが呼び出されるたびに初期化されます。一度初期化される静的メソッドによって参照される静的配列を作成することができます。 –

+0

はい、この関数を呼び出すたびに作成されます。これを最適化するために何かを変更する必要がありますか?プロフィール。それが問題なら、変更してください。 – moreON

+0

@KRichardsonありがとう!多分あなたは私がそれを受け入れることができるように答えを与えるべきですか? :) – sooqua

答えて

0

。別の方法として、静的メソッドで初期化された静的配列を作成し、Countメソッドで事前初期化された配列を参照できます。

2

メモリは、メソッドが実行されるたびに割り当てられます。新しいキーワードのためではありません。次のメソッドは、提供されたメソッドとまったく同じ効果を持ち、新しいキーワードはありません。メモリはメソッドの最後に参照解除されるため、メモリへの影響は最小限に抑えられます。

private static int CountAbcdef(string s) 
{ 
    var abcdef = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
    return s.Count(abcdef.Contains); 
} 

メソッドを最適化するには、メソッド外に配列を移動して静的にすることができます。配列は、クラスの最初の使用時に1回だけ初期化されます。静的配列参照が変更されないようにするには、readonlyキーワードを使用します。

2

パフォーマンスクリティカルセクションではLINQを使用しないでください。 overheadを避けることができます:

private static int CountAbcdef(string s) 
{ 
    int count = 0; 
    foreach (char c in s) 
     if (c >= 'a' && c <= 'f') 
      count++; 
    return count; 
} 
関連する問題