パフォーマンス面では、文字列配列の代わりに列挙型を使用する方が効率的ですか?列挙型のメソッドと文字列の比較
特定のメソッドIsDefinedをテストし、文字列配列内のマッチアップをチェックすることにしました。私はそれぞれのランタイムをテストするためにStopwatchのオブジェクトを作成しました。
enum Color : byte { red, blue, green }
内部の主要:
string[] colArr = new string[] { "red", "blue", "green" };
string input = "green";
Stopwatch s1 = new Stopwatch();
int loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
foreach (var blah in colArr)
if (blah == input)
break;
s1.Stop();
Console.WriteLine("Runtime for foreach loop: {0}", s1.Elapsed);
loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
if (Enum.IsDefined(typeof(Color), input))
continue;
s1.Stop();
Console.WriteLine("Runtime for IsDefined method returned value: {0}", s1.Elapsed);
そして、私の出力は次のようになります。
Runtime for foreach loop: 00:00:01.4862817
Runtime for IsDefined method returned value: 00:00:09.3421654
Press any key to continue . . .
クラスのメインの外に列挙型を定義
:以下
コード、だから私は、もし私が書いたコードが、愚かなものではない、あるいは物事 - それらの数字は正常であり、もしそうであれば、文字列配列を使用するのに好ましいenumをどのような方法で使用していますか?
どちらも独自の目的を持っています。開発者に優しいAPIにはenumを使用し、ユーザー入力には文字列を使用します。あなたの研究は何を示しましたか? – CodeCaster
あなたは文字列のようにenumを使用していますが、それはあまり効率的ではありません。代わりに 'Color'として保存してください。例:' Color input = Color.green; '。次に、それが存在するかどうかを確認する必要はありません。 –
'Enum.IsDefined(typeof(Color)、input)'の呼び出しはおそらく文字列を解析してアンボクシングする必要があるので、計算を偽装します。より適切な結果を得るには、 'Enum.GetValues'を' foreach(var blah in colArr) 'と同等のものとして使うことができます。 – HimBromBeere